使用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
调试解决步骤
错误原因分析
报错指向putText函数的org参数(文本起始坐标)类型错误。代码中c1通过tuple(x[1:3].int())生成,这里的.int()是PyTorch张量的类型转换方法,得到的是整数类型的张量元素,而非Python原生int类型,OpenCV无法解析张量类型的坐标参数。代码修复
将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)验证调试
在代码中添加打印语句,确认变量类型:print(type(c1[0]), c1[0])运行后若输出为
<class 'torch.Tensor'> tensor(xx),说明确实是张量类型;修复后应变为<class 'int'> xx。
内容的提问来源于stack exchange,提问作者Roachan K
相关产品推荐
相关产品推荐

