我下面的图像是一个numpy数组
我想
将块分成单独的轮廓或任何坐标表示。
然后我想将任何凹面多边形转换为多个凸面多边形。
赞
到目前为止,我已经设法使用opencv将每个块隔离为轮廓...但是有一种简单的方法可以将L形状的对象拆分为两个或更多正方形块。每个形状的新轮廓可以根据需要重叠。
在这种情况下,我的图像可能也没有这样的直线。
我使用cv2.approxPolyDP
绘制形状,但是它们又是凹形的,我需要将它们分开。
任何帮助表示赞赏。
答案 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生成的轮廓-如下生成轮廓。
然后“平滑”颜色,使颜色更少。我用过这个
epsilon = 0.005 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
然后将其运行到sect
constrained_delaunay_triangles([tuple(x) for x in approx.squeeze()])
输出将多边形分割成三角形,从而完全去除所有凹形多边形。