在np.array上应用cv2.boundingRect

时间:2016-11-08 23:47:46

标签: python opencv

如何将cv2.boundingRect应用于np.array点?
以下代码会产生错误。

points = np.array([[1, 2], [3, 4]], dtype=np.float32)
import cv2
cv2.boundingRect(points)

错误:

OpenCV Error: Unsupported format or combination of formats (The image/matrix format is not supported by the function) in cvBoundingRect, file /build/buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/shapedescr.cpp, line 97

File "<ipython-input-23-42e84e11f1a7>", line 1, in <module>
  cv2.boundingRect(points)
error: /build/buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/shapedescr.cpp:970: error: (-210) The image/matrix format is not supported by the function in function cvBoundingRect

1 个答案:

答案 0 :(得分:2)

2.x版本的OpenCV的Python绑定使用与3.x中的数据略有不同的某些数据表示。

从现有的代码示例(例如SO上的this answer),我们可以看到我们可以使用cv2.boundingRect返回的轮廓列表的en元素调用cv2.findContours。让我们来看看它是什么样的:

>>> a = cv2.copyMakeBorder(np.ones((3,3), np.uint8),1,1,1,1,0)
>>> b,c = cv2.findContours(a, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
>>> b[0]
array([[[1, 1]],

       [[1, 3]],

       [[3, 3]],

       [[3, 1]]])

我们可以看到轮廓中的每个点都表示为[[x, y]],我们有一个列表。

因此

import numpy as np
import cv2

point1 = [[1,2]]
point2 = [[3,4]]

points = np.array([point1, point2], np.float32)

print cv2.boundingRect(points)

我们得到输出

(1, 2, 3, 3)