日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pcl里面的点特征直方图(PFH)

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pcl里面的点特征直方图(PFH) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

表面法線和曲率可以好的代表一個點的幾何特征。然而它們算得很快,而且算法簡單,但是它們不能捕獲細節,它們只是點的近鄰的幾何特征的近似估計。作為一個直接的結論,大多數的場景往往會包括很多有著相似特征的點,這會減少它們所帶來的消息量。

這次我們將引進一個叫做PFH(point feature histgrams)的3D特征描述器,同時還將顯示出它的一些理論優勢,并討論它的一些實現細節。

PFH的目標是通過使用一個點周圍的多維直方圖的平均曲率來編碼一個點的k個最近鄰的幾何屬性。這個高維空間提供了一些有用的特征代表,同時關于6位位姿不變的,同時和可以很好的應對不同的采樣密度和近鄰的噪聲水平。

一個點特征直方圖是與點的最近鄰和法線有關的,簡單的說,它企圖通過考慮各個預測法線方向之間的影響來捕獲最好的采樣平面。最終的高維空間因此和每個點的表面法線的方向有關。

下面的圖展示了一個PFH在計算Pq這個點時候的影響區域圖,Pq這個點用紅色標記并放在半徑為r的圓圈的中央,然后它的所有近鄰(離點的距離小于半徑r)都通過一個網格來間接的相鄰著。下面的PFH描述器作為了一個直方圖計算了所有匹配的點之間的關系,有一個O(k方)的復雜度。

計算pi和pj之間的絕對差,和與它們相關聯的法線ns和nj,我們定義了一個固定的坐標系在某個點上。

我發現官網里面的上面的式子與下面的圖對應不上,以圖為標準,式子里面的那個v向量的方向和大小與圖里面的都對不上。使用上面的uvw的坐標系,ns法線和ni法線的差可以化解為下面的3個角度的差異(因為他們的模都是一樣的):

d是兩點距離的平方,是每對點的4要素,這樣就把原來的12個值(2x每個點的{(x,y,z),(nx,ny,nz)})減低為4個值。

使用PFH得到一個點的四要素可以用下面的方法:

computePairFeatures (const Eigen::Vector4f &p1, const Eigen::Vector4f &n1,const Eigen::Vector4f &p2, const Eigen::Vector4f &n2,float &f1, float &f2, float &f3, float &f4);

去生成最終的對每個查詢點的PFH代表,四要素這個集合將放到直方圖里面。分發的過程是把所有的特征(上面的3個角度,一個距離的平方)平均分割成b小份,然后數每個子區間上的個數。因為有3個特征是法線間的角度,所以他們可以很好的歸一化并把它們放到三角函數的圓(高中知識)里面。一個分發的案例是把每個特征區間進行平均分配,然后我們就有了一個有b的四次方分發的柱狀圖。在這個圖里面有一個區間的值不為0代表著,它這個特征有一定的值。下面的這幅圖展示了一個點云里面不同點的PFH圖。

?

有的情況下,d不是一個好的特征對于2.5D的數據集,比如機器人來說,距離會隨著視點發生變化。所以,有的時候省略d是比較好的。

PFH特征在PCL里面是pcl_features庫里面

默認的PFH用5個區間來分發,并不包括距離,因此有125比特的數組生成5的3次方,并把它們放在pcl::PFHSignature125這個點類型里面。

下面是一個代碼段。

#include <pcl/point_types.h> #include <pcl/features/pfh.h>{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal> ());... read, pass in or create a point cloud with normals ...... (note: you can create a single PointCloud<PointNormal> if you want) ...// Create the PFH estimation class, and pass the input dataset+normals to itpcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::PFHSignature125> pfh;pfh.setInputCloud (cloud);pfh.setInputNormals (normals);// alternatively, if cloud is of tpe PointNormal, do pfh.setInputNormals (cloud);// Create an empty kdtree representation, and pass it to the PFH estimation object.// Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());//pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr tree (new pcl::KdTreeFLANN<pcl::PointXYZ> ()); -- older call for PCL 1.5-pfh.setSearchMethod (tree);// Output datasetspcl::PointCloud<pcl::PFHSignature125>::Ptr pfhs (new pcl::PointCloud<pcl::PFHSignature125> ());// Use all neighbors in a sphere of radius 5cm// IMPORTANT: the radius used here has to be larger than the radius used to estimate the surface normals!!!pfh.setRadiusSearch (0.05);// Compute the featurespfh.compute (*pfhs);// pfhs->points.size () should have the same size as the input cloud->points.size ()* }

PFHEstimation類的內部做了幾件事情:

1.得到p的最近鄰

2.給每個鄰近的配對,計算3個角度

3.把所有的結果分發到直方圖里面。

只計算一個單一的PFH特征代表:

computePointPFHSignature (const pcl::PointCloud<PointInT> &cloud,const pcl::PointCloud<PointNT> &normals,const std::vector<int> &indices,int nr_split,Eigen::VectorXf &pfh_histogram);

nr_spilit是被分發的某個區間,即代表了某個角度特征,pfh_histgram是結果的直方圖。

因為有的時候法線的值可能是NaN(不是數字)或者無效值,所以可以用下面的代碼進行優化,下面這段代碼放在compute()這個函數的上面

for (int i = 0; i < normals->points.size(); i++) {if (!pcl::isFinite<pcl::Normal>(normals->points[i])){PCL_WARN("normals[%d] is not finite\n", i);} }

?

?

?

?

總結

以上是生活随笔為你收集整理的pcl里面的点特征直方图(PFH)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。