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

标签 python opencv

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 坐标有关吗?我猜那是矩形的四个角?那么它们到底是什么?谢谢!

最佳答案

“盒子”值的常见误解是“盒子”ndarray 的第一个子列表始终是矩形的左下角点。 例如,在下图所示的矩形中,“box”ndarray 的第一个子列表不必始终代表点 A。

rectangle

所以这是“框”值代表的内容:

正如问题正确指出的那样,当你打印 box 时,你会得到一个看起来像这样的 ndarray:

enter image description here

然后我更深入地描述并编写了这个简单的 for 循环以真正理解“框”值实际代表什么:

for i in box:
    cv2.circle(image,(i[0],i[1]), 3, (0,255,0), -1)
    imgplot = plt.imshow(image)
    plt.show()

结果是:(图片按顺序排列)

first image

enter image description here

enter image description here

enter image description here

我认为图像应该已经消除了任何人对“框”值的怀疑,但无论如何这里是一个总结:

矩形的最低点(无论是左还是右)将始终是“框”ndarray 的第一个子列表。因此,在我给出的示例中,第一个子列表 [169 144] 表示“this 矩形的右下角”。 现在这一点将成为决定下一个子列表代表什么的引用点。意思是,下一个子列表将始终表示您在顺时针方向 移动时首先得到的点。 (如for循环第二张图所示)

并继续顺时针方向移动以查看下一个子列表代表什么。

PS:有时很难阅读 OpenCV 文档(顺便说一下,这不是世界上最好的文档)并正确理解函数及其返回值。所以我建议编写小块代码,例如上面的 for 循环和 cv2.circle,以真正可视化函数的返回值。这应该真正消除您对 OpenCV 中遇到的任何函数的所有疑虑。毕竟,OpenCV 就是关于“可视化”的!

关于python - cv2.cv.BoxPoints(rect) 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739411/

相关文章:

java - JAVA (Android) 中的 OpenCV 绘制轮廓

python - 如何将数字形式的 python 列表转换为字母?

python - 按一列或另一列对 pandas 数据框进行分组

python - 我怎样才能从 python 中的 xml 中删除 ns?

c++ - 用于 cv::Mat 参数的 OpenCV std::vector

c++ - OpenCV RGB值检测?

python - 在总价格接近 N 的梦幻足球阵容中自动选择 11 名球员的算法

php - 如何防止我的网站页面通过 iFrame 的第 3 方网站框架加载

多个图像上的 C++ OpenCV 线性代数?

image-processing - 如何根据颜色和大小分割对象?