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

时间:2014-07-14 20:07:58

标签: python opencv polygon lines fill

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

对于每一行,我都有一系列(x,y)点。这些点以规则的间隔直接穿过X轴上的图像。

我想基本上绘制一个填充矩形,它覆盖从一行到下一行的图像,填充将为白色,以隐藏在两行线点的顶部和底部组成的行上的内容。

问题在于,当我浏览图像时,线条的Y位置会发生少量变化,因此矩形不能很好地适应该行。

我认为我基本上需要使用我所知道的点并填充它来绘制自由形状 这样顶部和底部线之间的区域就会被着色。

我尝试使用以下命令创建多边形:

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

然而,我得到的两个三角形从正确的点开始,但在中间相遇,而不是产生一个覆盖一行图像的完全填充的形状,而是留下了“'矩形”的其余部分。未填充的。

如何在OpenCV中绘制一个自由形状,它覆盖了我所拥有的顶部和底部的点,但也填充了两条线之间的所有像素?

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

1 个答案:

答案 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来确定凸包(最小封闭点集)并填充该多边形。文档如下:

http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=convexhull#convexhull