opencv cv2.cv.BoxPoints(rect)返回什么?

lmvvr0a8  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(177)
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坐标的权利?我猜这是矩形的四个角?那么他们到底是什么?谢谢!

dy1byipe

dy1byipe1#

对“box”值的常见误解是,“box”ndarray的第一个子列表总是矩形的左下角点。例如,在下面显示的矩形中,“box”ndarray的第一个子列表不必总是表示点A。

下面是“box”值所代表的内容:
正如问题正确指出的那样,当你打印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”ndarray的第一个子列表。所以在我给出的例子中,第一个子列表[169 144]表示“*this * rectangle的右下角”。现在这个点将是决定下一个子列表表示什么的参考点。意思是,下一个子列表将始终表示当你在顺时针方向移动时第一个得到的点。(如for循环的第二个图像所示)
并继续顺时针方向移动,看看下一个子列表代表什么。
附言:有时候,阅读OpenCV文档(顺便说一句,它并不是世界上最好的)并正确理解函数及其返回值是非常困难的。因此,我建议您编写一些小块代码,如上面的for循环和cv2.circle,以真正可视化函数的返回值。这应该真正消除您对OpenCV中遇到的任何函数的所有疑虑。毕竟,OpenCV是所有关于“视觉化”!

bpsygsoo

bpsygsoo2#

这是定义提供给它的旋转矩形的4个点。请记住,在opencv中,点被绘制为(x,y)而不是(row,column),y轴是正向下的。因此,第一个点将被绘制在图像左侧右侧200像素和图像顶部向下472像素处。换句话说,第一个点是图像的左下角点。

0yg35tkg

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的解决方案现在似乎是错误的(请原谅奇怪的数字,这直接来自我的一个项目的调试器):

rotrec = (
  (27.425756454467773, 947.3493041992188), # center pt
  (14.5321683883667, 50.921504974365234),  # W, H
  70.49755096435547                        # angle
)
cv2.boxPoints(rotrec)

产出:

array([[  0.99999475, 949.0001    ],
       [ 48.999996  , 932.0001    ],
       [ 53.851517  , 945.6985    ],
       [  5.8515167 , 962.6985    ]], dtype=float32)

(note根据Sushanth描述的算法,最后一个点具有较高的Y坐标,因此应该是返回多边形中的第一个点)

e0uiprwp

e0uiprwp4#

我认为第一个点将永远是最底部的点,它实际上将是右下角(如果有多个点可能是最底部的点)。

khbbv19g

khbbv19g5#

根据opencv-pythoncv2)的4.7.0.68版本,cv2.boxPoints()方法的返回值(xy坐标)按以下顺序(顺序是常数-不会改变):
1.右上
1.左上
1.右下
1.左下

ycggw6v2

ycggw6v26#

我也面临着同样的问题。
首先语法应该是boxPoints而不是BoxPoints
然后,用Python 3运行程序..它解决了我的问题
例如,python3 test.py

nzk0hqpo

nzk0hqpo7#

<class 'numpy.ndarray'>

你可以通过type(elemnt you want to know)找到
奇怪的是,在opencv python的文档中没有这些方法返回什么

相关问题