当前位置:   article > 正文

OpenCV的Delaunay三角剖分和Voronoi图的实现_c#delaunay三角形变形

c#delaunay三角形变形

左图:奥巴马总统的形象,使用CLM检测。 中心:Delaunay三角剖分。 右:对应的Voronoi图。

  这篇文章将帮助我们了解Delaunay三角剖分和Voronoi图。

什么是Delaunay 三角剖分?




给定平面中的一组点,三角测量指的是将平面细分为三角形,将点作为顶点。在图1中,我们在左图像上看到一组界标,以及在中间图像中的三角测量。一组点可以有许多可能的三角剖分,但Delaunay三角剖分出众,因为它有一些不错的属性。在Delaunay三角剖分中,选择三角形使得没有点在任何三角形的外接圆内。图2示出了4点A,B,C和D的Delaunay三角剖分。在顶部图像中,为了使三角剖分是有效的Delaunay三角剖分,点C应该在三角形ABD的外接圆外,并且点A应该在三角形BCD的外接圆。
Delaunay三角形的一个有趣的属性是它不喜欢“瘦”三角形(即具有一个大角度的三角形)。
图2显示了当移动点时,三角形如何改变以选择“胖”三角形。在顶部图像中,点B和D的x坐标在x = 1.5,在底部图像中,它们向右移动到x = 1.75。在顶部图像中,角度ABC和ABD大,并且Delaunay三角剖分在B和D之间创建边缘,将两个大角度分割成更小的角度ABD,ADB,CDB和CBD。另一方面,在底部图像中,角度BCD太大,并且Delaunay三角剖分产生边缘AC以划分大角度。
有很多算法来找到一组点的Delaunay三角剖分。最明显的(但不是最有效的)一个是从任何三角形开始,并检查任何三角形的外接圆包含另一个点。如果是,翻转边缘(如图2所示),并继续,直到没有三角形的外接圆包含一个点。
关于Delaunay三角剖分的任何讨论必须包括Voronoi图,因为一组点的Voronoi图是对其Delaunay三角剖分的数学对。

什么是Voronoi 图?


给定平面中的一组点,Voronoi图分割该空间使得边界线与相邻点等距。 图3示出了从显示为黑点的点计算的Voronoi图的示例。 你会注意到每条边界线都穿过两点的中心。 如果你连接在邻近的Voronoi地区的点,你得到德劳内三角!
Delaunay三角剖分和Voronoi图在更多的方面是相关的。

利用OPENCV实现剖分

给定一组点,您可以使用Subdiv2D类计算Delaunay三角剖分或Voronoi图。 这里是步骤。 

首先收集点数据:

  1. vector<Point2f> points;
  2. // This is how you can add one point.
  3. points.push_back(Point2f(x,y));

使用矩形(rect)定义要分区的空间。 如果您在上一步中定义的点在图像上定义,则此矩形可以是(0,0,width,height)。 否则,您可以选择一个矩形来限制所有点。

  1. Mat img = imread("image.jpg");
  2. Size size = img.size();
  3. Rect rect(0, 0, size.width, size.height);

使用上一步中获取的矩形创建Subdiv2D的实例。

Subdiv2D subdiv(rect); 

使用subdiv.insert(point)将点插入到subdiv中。 上面的视频显示了一个三角形的动画,因为我们向点添加点。
使用subdiv.getTriangleList获取Delaunay三角形的列表。
使用subdiv.getVoronoiFacetList获取Voronoi面的列表。


最终实现的效果为:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/128805
推荐阅读
相关标签
  

闽ICP备14008679号