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坐标的权利?我猜这是矩形的四个角?那么他们到底是什么?谢谢!
7条答案
按热度按时间dy1byipe1#
对“box”值的常见误解是,“box”ndarray的第一个子列表总是矩形的左下角点。例如,在下面显示的矩形中,“box”ndarray的第一个子列表不必总是表示点A。
下面是“box”值所代表的内容:
正如问题正确指出的那样,当你打印box时,你会得到一个看起来像这样的ndarray:
然后我又多做了一点描述,写了这个简单的for循环来真正理解“box”值实际上代表什么:
结果是:(图像按顺序排列)
我认为这些图片应该已经消除了任何人对“盒子”价值的怀疑,但无论如何,这里有一个总结:
矩形的最低点(无所谓左或右)将始终是“box”ndarray的第一个子列表。所以在我给出的例子中,第一个子列表[169 144]表示“*this * rectangle的右下角”。现在这个点将是决定下一个子列表表示什么的参考点。意思是,下一个子列表将始终表示当你在顺时针方向移动时第一个得到的点。(如for循环的第二个图像所示)
并继续顺时针方向移动,看看下一个子列表代表什么。
附言:有时候,阅读OpenCV文档(顺便说一句,它并不是世界上最好的)并正确理解函数及其返回值是非常困难的。因此,我建议您编写一些小块代码,如上面的for循环和cv2.circle,以真正可视化函数的返回值。这应该真正消除您对OpenCV中遇到的任何函数的所有疑虑。毕竟,OpenCV是所有关于“视觉化”!
bpsygsoo2#
这是定义提供给它的旋转矩形的4个点。请记住,在opencv中,点被绘制为(x,y)而不是(row,column),y轴是正向下的。因此,第一个点将被绘制在图像左侧右侧200像素和图像顶部向下472像素处。换句话说,第一个点是图像的左下角点。
0yg35tkg3#
把这个留给像我这样的人,找到这个并阅读(当前)投票最多的答案:现在似乎已经过时了。
目前(使用OpenCV 4.5.4,我不知道从什么时候开始),
cv.boxPoints()
的行为似乎与cv::RotatedRect::points()
的行为相匹配,即返回点的顺序是:[bottom-left, top-left, top-right, bottom-right]
。在文档中没有明确确认这一点,但是
cv.boxPoints()
的文档提到在C++中直接使用cv::RotatedRect::points()
,下面的例子表明Sushanth的解决方案现在似乎是错误的(请原谅奇怪的数字,这直接来自我的一个项目的调试器):产出:
(note根据Sushanth描述的算法,最后一个点具有较高的Y坐标,因此应该是返回多边形中的第一个点)
e0uiprwp4#
我认为第一个点将永远是最底部的点,它实际上将是右下角(如果有多个点可能是最底部的点)。
khbbv19g5#
根据
opencv-python
(cv2
)的4.7.0.68
版本,cv2.boxPoints()
方法的返回值(xy坐标)按以下顺序(顺序是常数-不会改变):1.右上
1.左上
1.右下
1.左下
ycggw6v26#
我也面临着同样的问题。
首先语法应该是
boxPoints
而不是BoxPoints
然后,用Python 3运行程序..它解决了我的问题
例如,
python3 test.py
nzk0hqpo7#
你可以通过
type(elemnt you want to know)
找到奇怪的是,在opencv python的文档中没有这些方法返回什么