尝试在opencv中使用boundingRect()
函数时出错。给出的是一个点列表
lists = []
for match in enumerate(matches):
lists.append(kp2[match.trainIdx].pt)
x,y,w,h = cv2.boundingRect(lists)
TypeError:points不是numpy数组,也不是标量
P / s:我想在图像
中围绕检测到的对象绘制一个矩形感谢任何帮助
修改
更改为np数组之前的列表
[(328.0, 227.0), (372.0, 241.0), (366.0, 229.0)]
之后
[[ 328. 227.]
[ 372. 241.]
[ 366. 229.]]
答案 0 :(得分:1)
我刚才有同样的问题。没有解决它,但这里是解决问题的代码:
points = ([1,1], [3,1], [3,3], [1,4])
xx, yy = zip(*points)
min_x = min(xx); min_y = min(yy); max_x = max(xx); max_y = max(yy)
bbox = [(min_x, min_y), (max_x, min_y), (max_x, max_y), (min_x, max_y)]
答案 1 :(得分:1)
点列表需要作为numpy数组传递。 因此,请先将其转换,例如与
lists = np.array(lists, dtype=np.float32)
失败的断言
'error: (-215) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function cv::pointSetBoundingRect'
如果创建的numpy数组不具有数据类型float32
或int32
,则会触发。另一个原因是如果传递的数组不包含任何点。
数组创建命令中的参数dtype=np.float32
确保所创建的数组的数据类型为float32
。在64位环境中,省略此参数将导致使用数据类型float64
创建数组,这将导致断言失败。
转换为数据类型为float32
的numpy数组后,将结果传递给cv.boundingRectangle
即可正常工作。
在我被搜索引擎引导到这里之后,有意回答了一个老问题。