cv2.cv.BoxPoints(rect)返回什么?

时间:2015-04-20 04:35:48

标签: python opencv

rect = cv2.minAreaRect(largest_contour)
rect = ((rect[0][0] * self.scale_down, rect[0][1] * self.scale_down), (rect[1][0] * self.scale_down, rect[1][1] * self.scale_down), rect[2])
box = cv2.cv.BoxPoints(rect)
print box 
box = np.int0(box)
cv2.drawContours(frame,[box], 0, (0, 0, 255), 2)

这就是我的代码的样子。我试着打印盒子看看是什么,我得到了一些打印结果,如((200.0, 472.0), (200.0, 228.0), (420.0, 228.0), (420.0, 472.0))。它应该有x和y坐标做对吗?我猜那是矩形的四个角落?那他们到底是什么?谢谢!

5 个答案:

答案 0 :(得分:7)

这是定义提供给它的旋转矩形的4个点。请记住,在opencv点中绘制为(x,y)而不是(行,列),y轴向下为正。因此,第一个点将被绘制在图像左侧的200个像素和从图像顶部向下的472个像素。换句话说,第一个点是图像的左下角。

答案 1 :(得分:4)

“框”值的常见误解是“框” ndarray的第一个子列表始终是矩形的左下角。 例如,在下面显示的矩形中,“框” ndarray的第一个子列表不必始终表示点A。

rectangle

这是“框”值代表的含义:

正如问题所正确指出的那样,当您打印框时,将得到一个看起来像这样的ndarray:

enter image description here

然后,我花了更多的精力进行描述,并编写了这个简单的for循环,以真正了解“ box”值实际上代表什么:

for i in box:
    cv2.circle(image,(i[0],i[1]), 3, (0,255,0), -1)
    imgplot = plt.imshow(image)
    plt.show()

结果是:(图像按顺序排列)

first image

enter image description here

enter image description here

enter image description here

我认为这些图像应该已经消除了任何人对“盒子”值的怀疑,但是无论如何这是一个摘要:

矩形的最低点(与左边或右边无关)将始终是“框” ndarray的第一个子列表。因此,在我给出的示例中,第一个子列表[169 144]表示“ 矩形的右下角”。 现在,此点将成为决定下一个子列表表示的参考点。也就是说,下一个子列表将始终代表您沿顺时针方向移动时首先获得的点。 (如for循环的第二张图片所示)

并继续沿顺时针方向移动,以查看下一个子列表所代表的内容。

PS:有时很难阅读OpenCV文档(虽然这并不是世界上最好的),并且正确理解函数及其返回值。因此,我建议增加一些代码块,例如上面的for循环和cv2.circle,以真正可视化函数的返回值。这确实应该消除您对OpenCV中遇到的任何功能的所有疑问。毕竟,OpenCV的全部目的在于“可视化”!

答案 2 :(得分:0)

我认为第一个点将始终是最底端的点,实际上它将位于右下角(如果有多个点可能是最底端的点)。

答案 3 :(得分:-1)

我遇到了同样的问题..

首先,语法应该是boxPoints而不是BoxPoints

然后,用python3运行程序..它解决了我的问题

示例,python3 test.py

答案 4 :(得分:-1)

<class 'numpy.ndarray'> 

您可以通过type(elemnt you want to know)

查找

很奇怪,方法返回的内容不在opencv python的文档中