使用OpenCV Python绘制多边形或自由形状图形

使用OpenCV Python绘制多边形或自由形状图形,python,opencv,polygon,lines,fill,Python,Opencv,Polygon,Lines,Fill,我通过Python使用OpenCV在图像中检测到一系列水平线 对于每一条直线,我都有一系列沿直线的(x,y)点。这些点在X轴上以固定的间隔穿过图像 我想画一个填充矩形,从一行到下一行覆盖图像,填充将是白色,以隐藏由两组线点的顶部和底部组成的行上的内容 问题是,当我穿过图像时,线条的Y位置会发生少量变化,因此矩形不会很好地适合该行 我想我基本上需要用我知道的点画一个自由形状并填充它 使顶部和底部线条上的点之间的区域着色 我已尝试使用以下命令中的点创建多边形: cv2.fillPoly(image,

我通过Python使用OpenCV在图像中检测到一系列水平线

对于每一条直线,我都有一系列沿直线的(x,y)点。这些点在X轴上以固定的间隔穿过图像

我想画一个填充矩形,从一行到下一行覆盖图像,填充将是白色,以隐藏由两组线点的顶部和底部组成的行上的内容

问题是,当我穿过图像时,线条的Y位置会发生少量变化,因此矩形不会很好地适合该行

我想我基本上需要用我知道的点画一个自由形状并填充它 使顶部和底部线条上的点之间的区域着色

我已尝试使用以下命令中的点创建多边形:

cv2.fillPoly(image, np.array([polygon_points], np.int32), 255)

然而,不是生成一个完全填充的形状来覆盖图像的一行,而是从正确的点开始,但在中间遇到两个三角形,剩下的“矩形”的其余部分没有填充。< /P> 我如何在OpenCV中绘制一个自由形状,它覆盖了我拥有的顶部和底部线条上的点,但也填充了两条线条之间的所有像素


我希望这是有道理的。感谢您的帮助。

这是因为您的积分很可能在列表中排序,如下图所示

_________________________
| pt1    pt2   ... ptm   |
|                        |
|                        |
| ptm+1  ptm+2 ... pt2m  |
|________________________|
正因为如此,polyfill函数尝试从ptm填充到ptm+1,生成三角形(我个人将其描述为沙漏形状)。你的问题有两种解决办法。您可以翻转第二组点,从

points = [pt1, pt2, ..., ptm, ptm+1, ptm+2, ..., pt2m]

然后是您的
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确定凸包(最小封闭点集)并填充该多边形。文件如下:

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)