Python Tuple使用问题:OpenCV绘制车牌矩形时参数类型报错排查
解决OpenCV cv2.line参数类型错误:Can't parse 'pt1'
问题场景
编写文本检测代码时,使用drawRedRectangleAroundPlate函数在原始图像imgOriginalScene上围绕车牌licPlate绘制红色旋转矩形。通过cv2.boxPoints获取旋转矩形的四个顶点后,调用cv2.line绘制四条红线,触发如下错误:
cv2.line(imgOriginalScene, tuple(p2fRectPoints[0]), tuple(p2fRectPoints[1]), SCALAR_RED, 2) # draw 4 red lines cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'line' > Overload resolution failed: > - Can't parse 'pt1'. Sequence item with index 0 has a wrong type > - Can't parse 'pt1'. Sequence item with index 0 has a wrong type
问题原因
cv2.boxPoints返回的顶点坐标是浮点数类型,但OpenCV的cv2.line等绘图函数要求坐标点必须是整数类型——图像像素位置为离散的整数索引,浮点数无法被解析。
解决方法
将cv2.boxPoints返回的坐标转换为整数类型,有两种常用方式:
方式1:转换整个坐标数组为整数
在获取顶点后直接将数组转为整数类型,代码更简洁高效:
# 获取旋转矩形顶点并转为整数 p2fRectPoints = cv2.boxPoints(licPlate).astype(int) # 绘制四条红线 cv2.line(imgOriginalScene, tuple(p2fRectPoints[0]), tuple(p2fRectPoints[1]), SCALAR_RED, 2) cv2.line(imgOriginalScene, tuple(p2fRectPoints[1]), tuple(p2fRectPoints[2]), SCALAR_RED, 2) cv2.line(imgOriginalScene, tuple(p2fRectPoints[2]), tuple(p2fRectPoints[3]), SCALAR_RED, 2) cv2.line(imgOriginalScene, tuple(p2fRectPoints[3]), tuple(p2fRectPoints[0]), SCALAR_RED, 2)
方式2:转换单个坐标点为整数
如果不需要修改整个数组,也可以在转换为tuple时逐个元素转成整数:
p2fRectPoints = cv2.boxPoints(licPlate) # 绘制时将每个坐标元素转为int cv2.line(imgOriginalScene, tuple(map(int, p2fRectPoints[0])), tuple(map(int, p2fRectPoints[1])), SCALAR_RED, 2) cv2.line(imgOriginalScene, tuple(map(int, p2fRectPoints[1])), tuple(map(int, p2fRectPoints[2])), SCALAR_RED, 2) cv2.line(imgOriginalScene, tuple(map(int, p2fRectPoints[2])), tuple(map(int, p2fRectPoints[3])), SCALAR_RED, 2) cv2.line(imgOriginalScene, tuple(map(int, p2fRectPoints[3])), tuple(map(int, p2fRectPoints[0])), SCALAR_RED, 2)
内容的提问来源于stack exchange,提问作者rady alz
相关产品推荐
相关产品推荐

