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

使用YOLOv3做目标检测时遇OpenCV putText重载解析失败问题求助

YOLOv3目标检测项目OpenCV putText错误调试方案

问题背景

基于YOLOv3开发图像与视频目标检测项目,修改代码后出现无法调试的OpenCV错误。

出错代码片段

def write(x, batches, results):
    c1 = tuple(x[1:3].int())
    c2 = tuple(x[3:5].int())
    img = results[int(x[0])]
    cls = int(x[-1])
    label = "{0}".format(classes[cls])
    color = random.choice(colors)
    cv2.rectangle(img, (int(c1[0]), int(c1[1])), (int(c2[0]), int(c2[1])), color, 1)
    t_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 1 , 1)[0]
    c2 = c1[0] + t_size[0] + 3, c1[1] + t_size[1] + 4
    cv2.rectangle(img, (int(c1[0]), int(c1[1])), (int(c2[0]), int(c2[1])), color, -1)
    cv2.putText(img, label, (c1[0], c1[1] + t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 1, [225,255,255], 1)
    return img

报错信息

cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'putText'
> Overload resolution failed:
>  - Can't parse 'org'. Sequence item with index 0 has a wrong type
>  - Can't parse 'org'. Sequence item with index 0 has a wrong type

调试解决步骤

  1. 错误原因分析
    报错指向putText函数的org参数(文本起始坐标)类型错误。代码中c1通过tuple(x[1:3].int())生成,这里的.int()是PyTorch张量的类型转换方法,得到的是整数类型的张量元素,而非Python原生int类型,OpenCV无法解析张量类型的坐标参数。

  2. 代码修复
    将putText中的坐标元素从张量转为Python原生整数,使用.item()方法提取张量数值:

    cv2.putText(img, label, (int(c1[0].item()), int(c1[1].item()) + t_size[1] + 4), cv2.FONT_HERSHEY_PLAIN, 1, [225,255,255], 1)
    

    建议统一修复所有坐标参数的类型,避免其他OpenCV绘图函数出现类似问题,比如前面的rectangle调用可改为:

    cv2.rectangle(img, (c1[0].item(), c1[1].item()), (c2[0].item(), c2[1].item()), color, 1)
    
  3. 验证调试
    在代码中添加打印语句,确认变量类型:

    print(type(c1[0]), c1[0])
    

    运行后若输出为<class 'torch.Tensor'> tensor(xx),说明确实是张量类型;修复后应变为<class 'int'> xx。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:09:25