点云贪心三角化原理

目前点云进行网格生成一般分为两大类方法:

1、 插值法。顾名思义,也就是重建的曲面都是通过原始的数据点得到的

2、逼近法。用分片线性曲面或其他曲面来逼近原始数据点,得到的重建曲面是原始点集的一个逼近。

我们主要介绍一种比较简单的贪心三角化法(对应的类名:pcl::GreedyProjectionTriangulation),也就是使用贪心投影三角化算法对有向点云进行三角化。有很大的局限性,它更适用于采样点云来自表面连续光滑的曲面,并且点云的密度变化比较均匀的情况。

贪心投影三角化的大致流程是这样的:

(1)先将点云通过法线投影到某一二维坐标平面内

(2)然后对投影得到的点云做平面内的三角化,从而得到各点的拓扑连接关系。平面三角化的过程中用到了基于Delaunay三角剖分 的空间区域增长算法

(3)最后根据平面内投影点的拓扑连接关系确定各原始三维点间的拓扑连接,所得三角网格即为重建得到的曲面模型。

Delaunay 三角剖分简介

先说说点集的三角剖分(Triangulation),对数值分析以及图形学来说,三角剖分都是极为重要的一项预处理技术。而Delaunay 三角剖分是一种常用的三角剖分的方法,这个方法比较常见,关于点集的很多种几何图都和Delaunay三角剖分相关,看下面这个图,左侧就是不满足Delaunay 三角剖分,右侧是Delaunay 三角剖分的结果。

    

Delaunay 三角剖分的有两个优点:

1.最大化最小角,“最接近于规则化的“的三角网。

2.唯一性(任意四点不能共圆)。

上图就是满足了Delaunay条件,所有三角形的顶点是不是都不在其他三角形的外接圆内,实际 判定时,可以通过观察具有公共边缘BD的两个三角形ABD和BCD,如果角度α和γ之和小于或等于180°,则三角形满足Delaunay条件。

        贪心投影三角化方法第2步就是利用Delaunay 三角剖分,它通过选取一个样本三角片作为初始曲面,不断扩张延伸曲面的边界,直到所有符合几何正确性和拓扑正确性的点都被连上,最后形成一张完整的三角网格曲面。

// 将点云位姿、颜色、法线信息连接到一起
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
pcl::concatenateFields(*cloud_smoothed, *normals, *cloud_with_normals);

//定义搜索树对象
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
tree2->setInputCloud(cloud_with_normals);

// 三角化
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;   // 定义三角化对象
pcl::PolygonMesh triangles; //存储最终三角化的网络模型

// 设置三角化参数
gp3.setSearchRadius(0.1);  //设置搜索时的半径,也就是KNN的球半径
gp3.setMu (2.5);  //设置样本点搜索其近邻点的最远距离为2.5倍(典型值2.5-3),这样使得算法自适应点云密度的变化
gp3.setMaximumNearestNeighbors (100);    //设置样本点最多可搜索的邻域个数,典型值是50-100

gp3.setMinimumAngle(M_PI/18); // 设置三角化后得到的三角形内角的最小的角度为10°
gp3.setMaximumAngle(2*M_PI/3); // 设置三角化后得到的三角形内角的最大角度为120°

gp3.setMaximumSurfaceAngle(M_PI/4); // 设置某点法线方向偏离样本点法线的最大角度45°,如果超过,连接时不考虑该点
gp3.setNormalConsistency(false);  //设置该参数为true保证法线朝向一致,设置为false的话不会进行法线一致性检查

gp3.setInputCloud (cloud_with_normals);     //设置输入点云为有向点云
gp3.setSearchMethod (tree2);   //设置搜索方式
gp3.reconstruct (triangles);  //重建提取三角化

setMaximumSurfaceAgle和setNormalConsistency 其实是用于处理有尖锐边缘或棱角的情况,以及表面的两面非常接近的情况。比如setMaximumSurfaceAgle,表示如果某点的法线偏离了参考点超过了指定的角度(典型为45°),那么它们就不会与当前点连接。

setNormalConsistency 的话,是保证法线朝向一致。因为大多数表面法线估计方法得到的法线,即使是在锐利的边缘之间也是平滑的过渡。因为不是所有的法线估计方法都能保证法线的方向一致。通常情况下,设置为false对大多数数据集有效。

注:本文参考了PCL官网

猜你喜欢

转载自blog.csdn.net/qq_30815237/article/details/86313534
今日推荐