问题描述
我有一个从这个链接中学到的代码 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)}.")