- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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。
所以这是“框”值代表的内容:
正如问题正确指出的那样,当你打印 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()
结果是:(图片按顺序排列)
我认为图像应该已经消除了任何人对“框”值的怀疑,但无论如何这里是一个总结:
矩形的最低点(无论是左还是右)将始终是“框”ndarray 的第一个子列表。因此,在我给出的示例中,第一个子列表 [169 144] 表示“this 矩形的右下角”。现在这一点将成为决定下一个子列表代表什么的引用点。意思是,下一个子列表将始终表示您在顺时针方向 移动时首先得到的点。 (如for循环第二张图所示)
并继续顺时针方向移动以查看下一个子列表代表什么。
PS:有时很难阅读 OpenCV 文档(顺便说一下,这不是世界上最好的文档)并正确理解函数及其返回值。所以我建议编写小块代码,例如上面的 for 循环和 cv2.circle,以真正可视化函数的返回值。这应该真正消除您对 OpenCV 中遇到的任何函数的所有疑虑。毕竟,OpenCV 就是关于“可视化”的!
关于python - cv2.cv.BoxPoints(rect) 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739411/
我正在尝试在简单图像上绘制最小框轮廓。 Original Image 但是,从 boxPoints() 函数返回的点之一给我一个负 y 值。绘制此轮廓时,此角是从图像中绘制出来的。 Resulting
rect = cv2.minAreaRect(largest_contour) rect = ((rect[0][0] * self.scale_down, rect[0][1] * self.sca
我尝试了以下方法: cv::RotatedRect minRect = cv::minAreaRect(contour); std::vector boxPts; cv::boxPoints(minR
我是 OpenCV 的初学者。我想在检测到的标记周围制作边界框。 你能告诉我如何使用 OpenCV (Python) 实现吗? 我正在使用 Python 3.6.3 和 openCV box =np.
我是一名优秀的程序员,十分优秀!