python boundingRect与点列表

时间:2016-05-05 01:50:05

标签: python opencv

尝试在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.]]

2 个答案:

答案 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数组不具有数据类型float32int32,则会触发

。另一个原因是如果传递的数组不包含任何点。

数组创建命令中的参数dtype=np.float32确保所创建的数组的数据类型为float32。在64位环境中,省略此参数将导致使用数据类型float64创建数组,这将导致断言失败。

转换为数据类型为float32的numpy数组后,将结果传递给cv.boundingRectangle即可正常工作。

在我被搜索引擎引导到这里之后,有意回答了一个老问题。