Python+OpenCV手势识别项目运行报IndexError索引越界错误如何解决
问题解决指南
问题根源
这个报错核心是OpenCV版本差异加缺少边界校验导致:你朋友运行正常的环境大概率是OpenCV 3.x版本,你本地使用的是OpenCV 4.x高版本,两个版本在cv2.convexityDefects的返回值规则、轮廓索引处理逻辑上有细微差异,再加上你的代码没有对异常帧、异常轮廓做过滤,就触发了索引越界。
具体修改步骤
你可以按顺序修改以下代码点,修改后即可正常运行:
- 第一步:增加帧读取有效性校验和轮廓面积过滤,避免空帧、小噪点轮廓导致后续计算异常
找到ret, img = capture.read()这行,在下面新增判断:
找到if not ret: continuecont = max(contours, key=lambda item: cv2.contourArea(item))这行,在下面新增判断:# 面积阈值可以根据实际情况调整 if cv2.contourArea(cont) < 1000: continue - 第二步:增加凸缺陷非空校验,避免轮廓为纯凸形时返回空值报错
找到defects = cv2.convexityDefects(cont, hull)这行,在下面新增判断:if defects is None: continue - 第三步:增加索引边界校验,直接跳过超出轮廓长度的异常索引
找到s, e, d, f = defects[i, 0]这行,在下面新增判断:if s >= len(cont) or e >= len(cont) or f >= len(cont): continue - 第四步:修复外接矩形绘制错误(不影响报错,但会导致画出来的轮廓框位置不对)
把cv2.rectangle(crop_img, (x, y), (w, h), (0, 0, 255), 2)修改为:cv2.rectangle(crop_img, (x, y), (x+w, y+h), (0, 0, 255), 2)
如果修改后还是有异常,可以把cv2.findContours的最后一个参数cv2.CHAIN_APPROX_NONE替换为cv2.CHAIN_APPROX_SIMPLE再测试。
内容的提问来源于stack exchange,提问作者yummy pizza
相关产品推荐
相关产品推荐

