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)
Run Code Online (Sandbox Code Playgroud)
这就是我的代码的样子.我试着打印盒子看看是什么,我得到了一些打印结果,如((200.0, 472.0), (200.0, 228.0), (420.0, 228.0), (420.0, 472.0)).它应该有x和y坐标做对吗?我猜那是矩形的四个角落?那他们到底是什么?谢谢!
Sus*_*nth 22
“box”值的常见误解是“box”ndarray 的第一个子列表始终是矩形的左下角点。例如,在下面显示的矩形中,“box”ndarray 的第一个子列表不需要总是代表点 A。
所以这里是“box”值代表的内容:
正如问题正确指出的那样,当您打印 box 时,您将得到一个如下所示的 ndarray:
然后我加倍努力进行描述并编写了这个简单的 for 循环来真正理解“框”值实际代表什么:
for i in box:
cv2.circle(image,(i[0],i[1]), 3, (0,255,0), -1)
imgplot = plt.imshow(image)
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果是:(图像按顺序)
我认为这些图像应该消除了任何人对“框”值的怀疑,但无论如何这里是一个摘要:
矩形的最低点(左右无关)将始终是“box”ndarray 的第一个子列表。所以在我给出的例子中,第一个子列表 [169 144] 代表“这个矩形的右下角”。现在这个点将成为决定下一个子列表代表什么的参考点。意思是,下一个子列表将始终代表您沿顺时针方向移动时首先获得的点。(如 for 循环的第二张图片所示)
并继续沿顺时针方向移动以查看下一个子列表代表什么。
PS:有时很难阅读 OpenCV 文档(顺便说一句,这不是世界上最好的文档)并正确理解函数及其返回值。所以我建议搅动一小段代码,比如上面的 for 循环和 cv2.circle,来真正可视化函数的返回值。这应该真正消除您对 OpenCV 中遇到的任何函数的所有疑虑。毕竟,OpenCV 是关于“可视化”的!
这些是定义提供给它的旋转矩形的4个点.请记住,在opencv点中绘制为(x,y)而不是(行,列),y轴向下为正.因此,第一个点将被绘制在图像左侧的200个像素和从图像顶部向下的472个像素.换句话说,第一个点是图像的左下角.