打开CV轮廓-将凹面多边形分成多个凸面多边形

时间:2020-07-13 07:52:04

标签: python opencv computer-vision contour convex-polygon

我下面的图像是一个numpy数组

enter image description here

我想

  1. 将块分成单独的轮廓或任何坐标表示。

  2. 然后我想将任何凹面多边形转换为多个凸面多边形。

enter image description here

到目前为止,我已经设法使用opencv将每个块隔离为轮廓...但是有一种简单的方法可以将L形状的对象拆分为两个或更多正方形块。每个形状的新轮廓可以根据需要重叠。

在这种情况下,我的图像可能也没有这样的直线。

enter image description here

我使用cv2.approxPolyDP绘制形状,但是它们又是凹形的,我需要将它们分开。

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我可以想到的一种方法是,对于每个轮廓,首先找到它的凸包。See this link

现在找到轮廓与其凸包之间的缺陷点。 See this link

现在使用缺陷距离数据查找具有最大距离的点。该点将是2个对象以L形连接的点。现在,从该点开始,绘制一条与该点的轮廓切线垂直的线,然后再次找到轮廓。生成的轮廓将是L形的2个轮廓。

注意:采用这种方法时,一个对象的某个部分可能会进入另一部分,而在边界处将它们分开。

答案 1 :(得分:0)

好的,谢谢拉胡尔的回答。

我最终找到了一个包装,该包装可以帮助我确定解决问题的多边形。

使用:

下载
pip install sect 

然后:

from sect.triangulation import constrained_delaunay_triangles

采用openCV生成的轮廓-如下生成轮廓。

enter image description here

然后“平滑”颜色,使颜色更少。我用过这个

epsilon = 0.005 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)

然后将其运行到sect

constrained_delaunay_triangles([tuple(x) for x in approx.squeeze()])

输出将多边形分割成三角形,从而完全去除所有凹形多边形。

enter image description here