我通过Python使用OpenCV在图像中检测到一系列水平线。
对于每一行,我都有一系列(x,y)点。这些点以规则的间隔直接穿过X轴上的图像。
我想基本上绘制一个填充矩形,它覆盖从一行到下一行的图像,填充将为白色,以隐藏在两行线点的顶部和底部组成的行上的内容。
问题在于,当我浏览图像时,线条的Y位置会发生少量变化,因此矩形不能很好地适应该行。
我认为我基本上需要使用我所知道的点并填充它来绘制自由形状 这样顶部和底部线之间的区域就会被着色。
我尝试使用以下命令创建多边形:
cv2.fillPoly(image, np.array([polygon_points], np.int32), 255)
然而,我得到的两个三角形从正确的点开始,但在中间相遇,而不是产生一个覆盖一行图像的完全填充的形状,而是留下了“'矩形”的其余部分。未填充的。
如何在OpenCV中绘制一个自由形状,它覆盖了我所拥有的顶部和底部的点,但也填充了两条线之间的所有像素?
我希望这是有道理的。谢谢你的帮助。
答案 0 :(得分:1)
这是因为您的积分可能会在您的列表中排序,因为后续(尝试)图片显示
_________________________
| pt1 pt2 ... ptm |
| |
| |
| ptm+1 ptm+2 ... pt2m |
|________________________|
因此,polyfill函数试图从ptm填充到ptm + 1来制作三角形(我个人将其描述为沙漏形状)。您的问题有两种解决方案。你可以翻转第二组点来改变你的列表
points = [pt1, pt2, ..., ptm, ptm+1, ptm+2, ..., pt2m]
到
points = [pt1, pt2, ..., ptm, pt2m, pt2m-1, ..., ptm+1]
接着是fillPoly
来电(虽然fillConvexPoly
显然要快得多)
或替代
x1 = min(x_points)
y1 = min(y_points)
x2 = max(x_points)
y2 = max(y_points)
cv2.rectangle(img, (x1,y1), (x2,y2), thickness=-1)
编辑:如果要创建最小封闭点集的多边形,可以使用opencv函数convexHull来确定凸包(最小封闭点集)并填充该多边形。文档如下: