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坐标做对吗?我猜那是矩形的四个角落?那他们到底是什么?谢谢!
答案 0 :(得分:7)
这是定义提供给它的旋转矩形的4个点。请记住,在opencv点中绘制为(x,y)而不是(行,列),y轴向下为正。因此,第一个点将被绘制在图像左侧的200个像素和从图像顶部向下的472个像素。换句话说,第一个点是图像的左下角。
答案 1 :(得分:4)
“框”值的常见误解是“框” ndarray的第一个子列表始终是矩形的左下角。 例如,在下面显示的矩形中,“框” ndarray的第一个子列表不必始终表示点A。
这是“框”值代表的含义:
正如问题所正确指出的那样,当您打印框时,将得到一个看起来像这样的ndarray:
然后,我花了更多的精力进行描述,并编写了这个简单的for循环,以真正了解“ box”值实际上代表什么:
for i in box:
cv2.circle(image,(i[0],i[1]), 3, (0,255,0), -1)
imgplot = plt.imshow(image)
plt.show()
结果是:(图像按顺序排列)
我认为这些图像应该已经消除了任何人对“盒子”值的怀疑,但是无论如何这是一个摘要:
矩形的最低点(与左边或右边无关)将始终是“框” 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的文档中