图像分类特征检测器

问题描述

我有一个从这个链接中学到的代码 https://www.youtube.com/watch?v=nnH55-zD38I&t=1047s 但我收到一个错误消息:

line 62,in <module>
    cv2.putText(imgOriginal,classNames[id],(50,50),cv2.FONT_HERShey_COMPLEX,1,(0,255,0),1)
IndexError: list index out of range
[ WARN:0] global C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-m8us58q4\opencv\modules\videoio\src\cap_msmf.cpp 
(438) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback

代码如下:

import cv2
import numpy as np 
import os

path = '#2 Image descriptor\Assets\Query'
orb = cv2.ORB_create(nfeatures=1000)

#IMPORT IMAGES 
images = []
classNames = []
myList = os.listdir(path)
print('Jumlah Classes = ',len(myList))
#print(myList)
for cl in myList:
    imgCur = cv2.imread(f'{path}/{cl}',0)
    images.append(imgCur)
    classNames.append(os.path.splitext(cl)[0])
print (classNames)
   
def findDes(images) :
    desList = []
    for img in images :
        kp,des = orb.detectAndCompute(img,None)
        desList.append(des)
    return desList

def findID(img,desList,thres=15):
    kp2,des2 = orb.detectAndCompute(img,None)
    bf = cv2.BFMatcher()
    matchList = []
    finalVal = -1
    try :
        for des in desList:
            matches = bf.knnMatch(des,des2,k=2)
            good = []
            for m,n in matches:
                if m.distance < 0.7*n.distance:
                    good.append([m])
                matchList.append(len(good))
    except :
        pass
    #print(matchList)
    if len(matchList) != 0:
        if max(matchList) > thres:
            finalVal = matchList.index(max(matchList))
    return finalVal

desList = findDes(images)
print(len(desList))

cap = cv2.VideoCapture(0)
#cap = cv2.imread('#2 Image descriptor\Assets\Train\RE8.jpg')

while True:

    success,img2 = cap.read()
    imgOriginal = img2.copy()
    img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

    id = findID(img2,desList)
    if id != -1:
        cv2.putText(imgOriginal,1)

    cv2.imshow('img2',imgOriginal)
    
    if cv2.waitKey(1) == ord('q'):
        break 

cap.release() #to make sure disable the camera from the code
cv2.destroyAllWindows

我认为错误在:

imgCur = cv2.imread(f'{path}/{cl}',0)

解决方法

问题出在您代码的这一部分:

    if id != -1:
        cv2.putText(imgOriginal,classNames[id],(50,50),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),1)

该错误基本上是在告诉您,您正试图在列表中不存在的索引处对 id 列表中的 classNames 进行索引。例如,如果 classNames 列表为空,执行 classNames[0] 将返回错误。您可以像这样尝试调试:

    if id != -1:
        if id < len(classNames):
            cv2.putText(imgOriginal,1)
        else:
            print(classNames)
            print(f"Error: Attempted to index {id} from list of length {len(classNames)}.")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...