让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
问题描述:
执行yolov5的ui界面代码时出现了错误。
错误提示:
OpenCV(4.9.0) :-1: error: (-5:Bad argument) in function 'rectangle'
Overload resolution failed:
- img marked as output argument, but provided NumPy array marked as readonly
- Expected Ptrcv::UMat for argument 'img'
- argument for rectangle() given by name ('thickness') and position (4)
- argument for rectangle() given by name ('thickness') and position (4) 解决方案: 该错误提示是由使用OpenCV中的rectangle()函数时导致的。 第一个错误提示“img marked as output argument, but provided NumPy array marked as readonly”,表示传递给rectangle()函数的参数img是只读的NumPy数组,但该函数期望接收一个可写的UMat对象。因此,我们需要使用cv2.UMat()函数将NumPy数组转换成可写的UMat对象。 第二个错误提示“Expected Ptrcv::UMat for argument 'img'”,也是由于传递给rectangle()函数的img参数是NumPy数组,而函数期望接收一个UMat对象。 第三个和第四个错误提示“argument for rectangle() given by name ('thickness') and position (4)”表示函数的第四个参数thickness传递了两次。在执行函数时应该只有一个参数thickness。 下面是修改后的代码:
import cv2
import torch
model = torch.hub.load('.', 'custom', r'E:\yolov5-v5.0\runs\train\exp8\weights\best.pt', source='local')
img_path = r"E:\yolov5-v5.0\VOCdevkit\images\train\cat.2.jpg"
img = cv2.imread(img_path)
results = model(img)
bbox = results.xyxy[0].cpu().numpy()
for i in range(len(bbox)):
box = bbox[i]
x1, y1, x2, y2, conf, cls = int(box[0]), int(box[1]), int(box[2]), int(box[3]), box[4], int(box[5])
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), thickness=2)
text = f'{conf:.2f}, class: {cls}'
cv2.putText(img, text, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.imshow('result', img)
cv2.waitKey(0)
我们通过cv2.imread()函数读取了一张测试图片,然后通过yolov5模型获取了目标框的坐标信息bbox。 最后,我们遍历bbox,通过cv2.rectangle()和cv2.putText()函数在原始图像上画出目标框和类别信息,并用cv2.imshow()函数显示结果。 注意:在执行完整个程序后,要释放图像窗口,使用cv2.destroyAllWindows()函数关闭OpenCV窗口。