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坐标有关,对吧?我猜那是长方形的四个角吧?那么它们到底是什么呢?谢谢!
发布于 2019-10-01 21:06:26
对"box“值的常见误解是,"box”ndarray的第一个子列表总是矩形的左下角。例如,在下面显示的矩形中,"box“ndarray的第一个子列表不需要总是表示点A。

下面是"box“值所代表的内容:
正如问题正确指出的那样,当您打印框时,您将得到一个类似于以下内容的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()结果是:(图像按顺序排列)




我认为这些图片应该已经消除了任何人对"box“值的疑虑,但不管怎样,这里是一个总结:
矩形的最低点(左或右无关紧要)将始终是"box“ndarray的第一个子列表。所以在我给出的例子中,第一个子列表169144表示“this rectangle的右下角”。现在,这一点将成为决定下一个子列表代表什么的参考点。这意味着,下一个子列表将始终表示当您按顺时针方向移动时第一个获得的点。(如for循环的第二个图像所示)
并继续顺时针方向移动,看看下一个子列表代表什么。
PS:有时很难阅读OpenCV文档(顺便说一句,这不是世界上最好的文档)并正确理解函数及其返回值。因此,我建议使用一些小代码块,比如上面的for循环和cv2.circle,以便真正可视化函数的返回值。这应该会消除您对OpenCV中遇到的任何函数的所有疑虑。毕竟,OpenCV就是关于“可视化”的!
发布于 2015-04-20 12:58:58
这些是定义提供给它的旋转矩形的4个点。请记住,在opencv中,点被绘制为(x,y)而不是(行,列),并且y轴是正向下的。因此,第一个点将绘制在图像左侧右侧200像素处,距图像顶部472像素处。换句话说,第一个点是图像的左下角。
发布于 2018-08-21 23:42:13
我认为第一个点将始终是最底部的点,实际上它将是右下角(如果有多个点,则可能是最底部的点)。
https://stackoverflow.com/questions/29739411
复制相似问题