1. 程式人生 > >點雲貪心三角化原理

點雲貪心三角化原理

目前點雲進行網格生成一般分為兩大類方法:

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官網