You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+OpenCV手势识别项目运行报IndexError索引越界错误如何解决

问题解决指南

问题根源

这个报错核心是OpenCV版本差异加缺少边界校验导致:你朋友运行正常的环境大概率是OpenCV 3.x版本,你本地使用的是OpenCV 4.x高版本,两个版本在cv2.convexityDefects的返回值规则、轮廓索引处理逻辑上有细微差异,再加上你的代码没有对异常帧、异常轮廓做过滤,就触发了索引越界。

具体修改步骤

你可以按顺序修改以下代码点,修改后即可正常运行:

  • 第一步:增加帧读取有效性校验和轮廓面积过滤,避免空帧、小噪点轮廓导致后续计算异常
    找到ret, img = capture.read()这行,在下面新增判断:
    if not ret:
        continue
    
    找到cont = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:45:07