PCL點雲特征描述與提取(2)


點特征直方圖(PFH)描述子

    正如點特征表示法所示,表面法線和曲率估計是某個點周圍的幾何特征基本表示法。雖然計算非常快速容易,但是無法獲得太多信息,因為它們只使用很少的幾個參數值來近似表示一個點的k鄰域的幾何特征。然而大部分場景中包含許多特征點,這些特征點有相同的或者非常相近的特征值,因此采用點特征表示法,其直接結果就減少了全局的特征信息。那么三維特征描述子中一位成員:點特征直方圖(Point Feature Histograms),我們簡稱為PFH,從PCL實現的角度討論其實施細節。PFH特征不僅與坐標軸三維數據有關,同時還與表面法線有關。

 

     PFH計算方式通過參數化查詢點與鄰域點之間的空間差異,並形成一個多維直方圖對點的k鄰域幾何屬性進行描述。直方圖所在的高維超空間為特征表示提供了一個可度量的信息空間,對點雲對應曲面的6維姿態來說它具有不變性,並且在不同的采樣密度或鄰域的噪音等級下具有魯棒性。點特征直方圖(PFH)表示法是基於點與其k鄰域之間的關系以及它們的估計法線,簡言之,它考慮估計法線方向之間所有的相互作用,試圖捕獲最好的樣本表面變化情況,以描述樣本的幾何特征。因此,合成特征超空間取決於每個點的表面法線估計的質量。如圖所示,表示的是一個查詢點(Pq) 的PFH計算的影響區域,Pq 用紅色標注並放在圓球的中間位置,半徑為r, (Pq)的所有k鄰元素(即與點Pq的距離小於半徑r的所有點)全部互相連接在一個網絡中。最終的PFH描述子通過計算鄰域內所有兩點之間關系而得到的直方圖,因此存在一個O(k) 的計算復雜性。

                                                          

                                                                                       查詢點 的PFH計算的影響區域

為了計算兩點Pi和Pj及與它們對應的法線Ni和Nj之間的相對偏差,在其中的一個點上定義一個固定的局部坐標系,如圖2所示。

                                         

使用上圖中uvw坐標系,法線 之間的偏差可以用一組角度來表示,如下所示:

                                                                 

d是兩點Ps和Pt之間的歐氏距離, 。計算k鄰域內的每一對點的四組值,這樣就把兩點和它們法線相關的12個參數(xyz坐標值和法線信息)減少到4個

 為查詢點創建最終的PFH表示,所有的四元組將會以某種統計的方式放進直方圖中,這個過程首先把每個特征值范圍划分為b個子區間,並統計落在每個子區間的點數目,因為四分之三的特征在上述中為法線之間的角度計量,在三角化圓上可以將它們的參數值非常容易地歸一到相同的區間內。一個統計的例子是:把每個特征區間划分成等分的相同數目,為此在一個完全關聯的空間內創建有 個區間的直方圖。在這個空間中,一個直方圖中某一區間統計個數的增一對應一個點的四個特征值。如圖3所示,就是點雲中不同點的點特征直方圖表示法的一個例子,在某些情況下,第四個特征量d在通常由機器人捕獲的2.5維數據集中的並不重要,因為臨近點間的距離從視點開始是遞增的,而並非不變的,在掃描中局部點密度影響特征時,實踐證明省略d是有益的。

                                         

更詳細的解釋:pointclouds.org/documentation/tutorials/how_features_work.php#rusudissertation

  估計PFH特征

點特征直方圖(PFH)在PCL中的實現是pcl_features模塊的一部分。默認PFH的實現使用5個區間分類(例如:四個特征值中的每個都使用5個區間來統計),

以下代碼段將對輸入數據集中的所有點估計其對應的PFH特征。

 #include <pcl/point_types.h>                  //點類型頭文件

#include <pcl/features/pfh.h>                 //pfh特征估計類頭文件

...//其他相關操作

pcl::PointCloud<pcl::PointXYZ>::Ptrcloud(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::Normal>::Ptrnormals(new pcl::PointCloud<pcl::Normal>());

...//打開點雲文件估計法線等

//創建PFH估計對象pfh,並將輸入點雲數據集cloud和法線normals傳遞給它

pcl::PFHEstimation<pcl::PointXYZ,pcl::Normal,pcl::PFHSignature125> pfh;

pfh.setInputCloud(cloud);

pfh.setInputNormals(normals);

//如果點雲是類型為PointNormal,則執行pfh.setInputNormals (cloud);

//創建一個空的kd樹表示法,並把它傳遞給PFH估計對象。

//基於已給的輸入數據集,建立kdtree

pcl::KdTreeFLANN<pcl::PointXYZ>::Ptrtree(new pcl::KdTreeFLANN<pcl::PointXYZ>());

pfh.setSearchMethod(tree);

//輸出數據集

pcl::PointCloud<pcl::PFHSignature125>::Ptrpfhs(new pcl::PointCloud<pcl::PFHSignature125>());

//使用半徑在5厘米范圍內的所有鄰元素。

//注意:此處使用的半徑必須要大於估計表面法線時使用的半徑!!!

pfh.setRadiusSearch(0.05);

//計算pfh特征值

pfh.compute(*pfhs);

// pfhs->points.size ()應該與input cloud->points.size ()有相同的大小,即每個點都有一個pfh特征向量

PFHEstimation類的實際計算程序內部只執行以下:

對點雲P中的每個點p

1.得到p點的最近鄰元素

2.對於鄰域內的每對點,計算其三個角度特征參數值

3.將所有結果統計到一個輸出直方圖中

 

微信公眾號號可掃描二維碼一起共同學習交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM