Emgu CV(或OpenCV)中多边形集的Voronoi图

时间:2016-04-08 14:09:04

标签: opencv emgucv polygons voronoi

使用Emgu CV我从道路网络图像中的轮廓中提取了一组闭合多边形。多边形代表道路轮廓。结果如下所示,绘制在OpenStreetMaps地图上(来自Emgu CV的'像素'形式的多边形已转换为要绘制的纬度/经度形式)。

表示道路轮廓的多边形集:

enter image description here

我现在想要计算这个多边形集的Voronoi图,这将帮助我找到道路的中心线。但是在Emgu CV中,我只能找到一种获得点数的Voronoi图的方法。这是通过找到点集的Delaunay三角剖分(使用Subdiv2D类)然后使用GetVoronoiFacets计算voronoi面来完成的。

我尝试计算由集合中所有多边形定义的的Voronoi图(每个多边形是一个点列表),但这给了我一个极其复杂的Voronoi图,如同一个可能期待:

点集的Voronoi图:

enter image description here

此图像显示第一张图片的较小部分(为清楚起见,因为它是如此复杂)。事实上,图中的某些线条似乎代表了道路中心线,但是还有很多其他线路,很难找到提取“好”线的标准。线。

我面临的另一个潜在问题是,正如你应该能够从第一张图片中看出的那样,一些多边形在其他人的内部,所以我们不处于一组不相交的标准情况封闭的多边形。也就是说,有时道路位于一个多边形的外边界和另一个多边形的内边界之间。

我正在寻找有关如何使用Emgu CV(或Open CV)计算多边形集的Voronoi图的建议,希望能够克服我已经概述的第二个问题。如果不使用Emgu CV,我也会就如何实现这一点提出其他建议。

1 个答案:

答案 0 :(得分:0)

如果您已有多边形,则可以尝试计算Straight Skeleton

我没有尝试过,但CGAL有implementation。请注意,此特定函数license是GPL。

可能的问题可能是:

  

此CGAL包的当前版本只能构建   在带有孔的简单多边形内部的直骨架   是不能处理飞机上的一般多边形数字。

可能有解决方法。例如,您可以将所有多边形包含在更大的矩形中(这样原始多边形将成为新矩形的孔)。如果原始多边形有孔,这可能不会很好。要解决这个问题,您可以为每个带孔的多边形执行算法,然后将所有多边形放在一个矩形中,删除所有孔并再次执行算法。