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

Ubuntu20.04运行OpenCV Python目标检测代码出现IndexError越界问题求助

报错原因

你遇到的IndexError: list index out of range报错是下标越界导致的,从你打印的日志可以看到检测出的classId包含82,当代码执行classNames[classId-1]时,如果你的classNames列表长度小于等于81,就会触发越界错误。
常见的触发原因有三个:

  • 你使用的目标检测模型支持的分类数量大于classNames列表的长度,比如模型训练时用了90类数据集,但你只加载了80类的名称列表
  • 部分OpenCV DNN加载的模型输出的classId默认从0开始计数,你手动减1后会出现负数下标或偏移错误
  • 读取类别名称文件时操作不当,漏读了末尾的类别,导致classNames列表长度不足
修复方案

第一步:先加边界校验避免崩溃

修改循环内的代码,先判断下标合法性再取类别名,临时解决崩溃问题,同时可以打印异常的classId排查问题:

while True:
    success,img = cap.read()
    classIds, confs, bbox = net.detect(img,confThreshold=thres)
    print(classIds,bbox)
 
    if len(classIds) > 0:
        for classId, confidence,box in zip(classIds.flatten(),confs.flatten(),bbox):
            cv2.rectangle(img,box,color=(0,255,0),thickness=2)
            # 增加下标合法性校验
            idx = classId - 1
            if 0 <= idx < len(classNames):
                show_name = classNames[idx].upper()
            else:
                # 未知类别直接显示id,方便排查
                show_name = f"UNKNOWN_{classId}"
            cv2.putText(img, show_name, (box[0]+10,box[1]+30),
                cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)

第二步:核对模型和类别列表匹配性

  • 打印len(classNames)确认当前类别列表长度,再对照你使用的预训练模型的官方说明,确认模型支持的类别数量是否一致。比如常用的COCO数据集为80类,对应classId范围是1~80,若检测出82这类超过范围的id,说明模型和类别列表不匹配
  • 检查类别文件的读取代码,确认有没有漏读行、把空行算入列表的问题,读取时可以增加strip()过滤空行,避免列表长度不对

第三步:确认classId起始值

如果修改后出现大量UNKNOWN_0、UNKNOWN_1这类输出,说明你使用的模型输出的classId是从0开始计数的,把idx = classId - 1改为idx = classId即可。

内容的提问来源于stack exchange,提问作者ArFiction

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:15:04