Python中使用点列表进行边界矩形计算

3

在尝试使用opencv中的boundingRect()函数时,我遇到了一个错误。给定的是一组点。

lists = []
for match in enumerate(matches):
    lists.append(kp2[match.trainIdx].pt)
x,y,w,h = cv2.boundingRect(lists)

类型错误:points既不是numpy数组也不是标量

P / s:我想在图像中检测到的对象周围绘制一个矩形

任何帮助都会感激

编辑

更改之前的列表为np数组

[(328.0,227.0),(372.0,241.0),(366.0,229.0)]

更改后

[[328. 227.] [372. 241.] [366. 229.]]


2
使用numpy数组或标量。你所要做的就是查看错误消息。 - Natecat
1
错误:(-215) npoints >= 0 && (depth == CV_32F || depth == CV_32S) 在函数 cv::pointSetBoundingRect 中。从 OpenCV 得到了这个错误,看起来该函数只读取了数组中的一个对象。 - doudev
2个回答

3

我刚刚遇到了完全相同的问题。虽然没有解决它,但这里是解决问题的代码:

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)]

2
点的列表需要以numpy数组的形式传递。因此,首先要转换它,例如使用

lists = np.array(lists, dtype=np.float32)

断言失败
'error: (-215) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function cv::pointSetBoundingRect'

如果创建的numpy数组没有数据类型为float32int32,则会触发此错误。另一个原因是传递的数组不包含任何点。
在数组创建命令中使用参数dtype=np.float32可以确保创建的数组具有数据类型float32。在64位环境中,省略此参数将导致数组以数据类型float64创建,这会导致断言失败。
将结果转换为具有数据类型float32的numpy数组后,将其传递给cv.boundingRectangle将按预期工作。
故意回答一个旧问题,因为我被搜索引擎引导到了这里。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接