OpenCV ORB图像分类代码运行出现IndexError索引越界报错求助
报错原因
核心触发原因
你的IndexError完全是由findID函数里的缩进错误导致的:matchList.append(len(good))被错误放在了内层遍历特征匹配对的for循环里,每匹配一对特征点就向matchList追加一次值,最终matchList的长度会远大于参考图数量(也就是classNames的长度),当你取最大值对应的下标赋值给id时,这个下标已经超出了classNames的有效范围,直接触发越界错误。
其他潜在隐患
- 路径读取问题:你写的路径用了Windows默认的反斜杠分隔符,还有特殊字符
#,容易触发转义导致cv2.imread读取图片失败返回None,后续处理无效图像时的异常被你写的空try...except吞掉,也会进一步导致matchList长度异常,和你怀疑的imread行确实相关。 - 摄像头警告是Windows平台OpenCV调用默认MSMF驱动的通用提示,不影响核心功能但可以通过参数消除。
- 末尾
cv2.destroyAllWindows漏了括号,程序结束时不会自动销毁所有窗口。
解决方案
- 修正
findID函数的缩进,保证每个参考图只向matchList追加一次匹配数:
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 if len(matchList) != 0: if max(matchList) > thres: finalVal = matchList.index(max(matchList)) return finalVal
- 修复图片读取逻辑,避免无效图片加入列表:
# 路径用原始字符串避免转义问题 path = r'#2 Image descriptor\Assets\Query' # 读取时增加有效性判断 for cl in myList: imgCur = cv2.imread(f'{path}/{cl}', 0) if imgCur is not None: images.append(imgCur) classNames.append(os.path.splitext(cl)[0])
- 消除摄像头警告,修改VideoCapture初始化代码:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
- 修正窗口销毁代码,补全括号:
cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Alfico Permana
相关产品推荐
相关产品推荐

