點雲的平滑與法線計算

2021-09-08 16:36:20 字數 2951 閱讀 9276

需要平滑的情況:

1、用rgb-d雷射掃瞄器等裝置掃瞄物體,尤其是比較小的物體時,往往會有測量誤差。這些誤差所造成的不規則資料如果直接拿來曲面重建的話,會使得重建的曲面不光滑或者有漏洞,而且這種不規則資料很難用前面我們提到過的統計分析等濾波方法消除;

2、後處理過程中,對同乙個物體從不同方向進行了多次掃瞄,然後把掃瞄結果進行配準,最後得到乙個完整的模型,但是你配準的結果不一定準,比如,同一面牆壁由於配準誤差變成了「兩面牆」,並不能完全重疊。

點雲重取樣是通過「移動最小二乘」(mls, moving least squares )法來實現的,對應的類名叫做pcl::movingleastsquares

移動最小二乘法與傳統的最小二乘法相比,有兩個比較大的改進:

( 1)擬合函式的建立不同。這種方法建立擬合函式不是採用傳統的多項式或其它函式,而是由乙個係數向量 a(x)和基函式 p(x)構成, 這裡 a(x)不是常數,而是座標 x 的函式。 

( 2)引入緊支( compact support)概念,認為點 x 處的值 y 只受 x 附近子域內節點影響,這個子域稱作點 x 的影響區域, 影響區域外的節點對 x的取值沒有影響。在影響區域上定義乙個權函式w(x), 如果權函式在整個區域取為常數, 就得到傳統的最小二乘法。

1、擬合函式的建立:

在擬合區域的乙個局域子域 u 上,擬合函式表示:

式中,a( x) = [a1 ( x) ,a2 ( x) …am ( x) ]t為為待求係數,它是座標 x 的函式,p( x) = [p1 ( x) ,p2 ( x) …pm ( x) ]t 稱為基

函式,它是乙個階完備的多項式,是基函式的項式[7],常用的二次基為 [1,u,v,

數通常表示為 

使上式的函式最小化,w( x - xi ) 是節點 xi 的權函式。

2 、權函式的確定

權函式是移動最小二乘法的核心。在移動最小二乘法中,權函式 w( x - xi ) 應該具有緊支性,即權函式在 x 的乙個子域內不等於 0,在這個子域外全是 0,這個子域稱為權函式的支援域( 即 x 的影響域) ,其半徑記為 s。常用的權函式為立方樣條權函式:

hi 為第 i 節點的權函式支援域的大小,β 為引入的影響係數。

// 對點雲重取樣  

pcl::search::kdtree::ptr treesampling (new pcl::search::kdtree); // 建立用於最近鄰搜尋的kd-tree

pcl::pointcloudmls_points; //輸出mls

pcl::movingleastsquaresmls; // 定義最小二乘實現的物件mls

mls.setcomputenormals (false); //設定在最小二乘計算中是否需要儲存計算的法線

mls.setinputcloud (cloud_filtered); //設定待處理點雲

mls.setpolynomialorder(2); // 擬合2階多項式擬合,一般取2-5

mls.setpolynomialfit (false); // 設定為false可以 加速 smooth

mls.setsearchmethod (treesampling); // 設定kd-tree作為搜尋方法

mls.setsearchradius (0.05); // 單位m.設定用於擬合的k近鄰半徑,越大平滑力度越大

mls.process (mls_points); //輸出

點雲的法線計算一般有兩種方法:

1、使用曲面重建方法,從點雲資料中得到取樣點對應的曲面,然後再用曲面模型計算其表面的法線

2、直接使用近似值直接從點雲資料集推斷出曲面法線,這裡主要用第2種方法來近似估計點雲中每個點的表面法線。具體來說,就是把估計某個點的表面法線問題簡化為:從該點最近鄰計算的協方差矩陣的特徵向量和特徵值的分析,

從該點的周圍點鄰域(也稱為k鄰域)估計一點處的表面法線 ,所以這個k鄰域的選取也很關鍵。

// 法線估計

pcl::normalestimationnormalestimation; //建立法線估計的物件

normalestimation.setinputcloud(cloud_smoothed); //輸入點雲

pcl::search::kdtree::ptr tree(new pcl::search::kdtree); // 建立用於最近鄰搜尋的kd-tree

normalestimation.setsearchmethod(tree);

pcl::pointcloud::ptr normals (new pcl::pointcloud); // 定義輸出的點雲法線

// k近鄰確定方法,使用k個最近點,或者確定乙個以r為半徑的圓內的點集來確定都可以,兩者選1即可

normalestimation.setksearch(10); // 使用當前點周圍最近的10個點

//對於每乙個點都用半徑為3cm的近鄰搜尋方式

normalestimation.compute(*normals); //計算法線

點雲法向量計算步驟:

點雲法線計算

法線在點雲的處理中有著重要的意義,大部分點雲的處理都要用到法線如 點雲平滑濾波 配準 特徵計算與提取,曲率計算等都息息相關。關於法線的計算最早應該 於 su ce reconstruction from unorganized points hugues hoppe的文章。其中hoppe關於法線的計...

點雲法線估計 C 實現

二 程式實現 三 執行結果 四 法線估計存在的問題 表面法線是幾何體表面的重要屬性,在很多領域都有大量應用,例如 在進行光照渲染時產生符合可視習慣的效果時需要表面法線資訊才能正常進行,對於乙個已知的幾何體表面,根據垂直於點表面的向量,因此推斷表面某一點的法線方向通常比較簡單。然而,由於我們獲取的點雲...

點雲概念與點雲處理

點雲概念 點雲與三維影象的關係 三維圖像是一種特殊的資訊表達形式,其特徵是表達的空間中三個維度的資料,表現形式包括 深度圖 以灰度表達物體與相機的距離 幾何模型 由cad軟體建立 點雲模型 所有逆向工程裝置都將物體取樣成點雲 和二維影象相比,三維影象借助第三個維度的資訊,可以實現天然的物體 背景解耦...