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 坐标有关,对吗?我猜那是矩形的四个角?那么它们到底是什么?谢谢!
对“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()
结果是:(图片按顺序排列)
我认为这些图像应该可以消除任何人对“盒子”值的疑问,但无论如何,这里有一个摘要:
矩形的最低点(无论左或右)始终是“box”ndarray 的第一个子列表。因此,在我给出的示例中,第一个子列表 [169 144] 代表“右下角this长方形”。
现在这个点将成为决定下一个子列表代表什么的参考点。这意味着,下一个子列表将始终代表您在移动时首先得到的点顺时针方向。 (如for循环的第二张图所示)
继续按顺时针方向移动,看看下一个子列表代表什么。
PS:有时很难阅读 OpenCV 文档(顺便说一句,这不是世界上最好的文档)并正确理解函数及其返回值。因此,我建议编写一些小代码块,例如上面的 for 循环和 cv2.circle,以真正可视化函数的返回值。这确实可以消除您对 OpenCV 中遇到的任何函数的所有疑虑。毕竟,OpenCV 就是“可视化”!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)