如何将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
答案 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)