3D點雲特征描述與提取是點雲資訊進行中最基礎也是最關鍵的一部分,點雲的識别。分割,重采樣,配準曲面重建等處理大部分算法,都嚴重依賴特征描述與提取的結果。從尺度上來分,一般分為局部特征的描述和全局特征的描述,例如局部的法線等幾何形狀特征的描述,全局的拓樸特征的描述,都屬于3D點雲特征描述與提取的範疇,
特征描述與提取相關的概念與算法
1.3D形狀内容描述子(3D shape contexts)
利用描述子建立曲面間的對應點在3D物體識别領域有廣發的應用,采用一個向量描述曲面上指定點及鄰域的形狀特征,通過比對向量的值來建立不同曲面點的對應關系,此相鄰則則稱為指定點的俄描述子,經典描述子的3D形狀内容描述子結構簡單,辨識力強,且對噪聲不敏感,
2,旋轉圖像(spin iamge)
旋轉圖像最早是由johnson提出的特征描述子,主要用于3D場景中的曲面比對和模型識别,
3,涉及的算法相關的資料
3D形狀内容描述子
https://en.wikipedia.org/wiki/Shape_context
www.eecs.berkeley.edu/Research/Projects/CS/vision/shape/belongie-pami02.pdf
還有很多中描述子的理論與算法的研究,不再一一列出來
關于理論的部分有待研究,但是暫時我隻是學習會用。
關于PCL中特征描述與提取子產品和相關類的介紹
class
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_shape_context3_d_estimation.html">pcl::ShapeContext3DEstimation< PointInT, PointNT, PointOutT > </a>
實作3D形狀内容描述子算法
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_b_o_a_r_d_local_reference_frame_estimation.html">pcl::BOARDLocalReferenceFrameEstimation< PointInT, PointNT, PointOutT ></a>
實作局部坐标系估計的方法 特别是處理點雲邊緣或有孔洞有特殊的處理方式
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_boundary_estimation.html">pcl::BoundaryEstimation< PointInT, PointNT, PointOutT ></a>
實作估計一組點集是否處于指定點的投影區域的邊緣位置
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_c_r_h_estimation.html">pcl::CRHEstimation< PointInT, PointNT, PointOutT ></a>
實作攝像頭旋轉直方圖描述子,利用概算法主要進行剛體對象的位姿估計
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_c_v_f_h_estimation.html">pcl::CVFHEstimation< PointInT, PointNT, PointOutT ></a>
實作聚類視點直方圖CVFH描述子的計算 主要是針對解決有殘缺的點雲識别問題
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_e_s_f_estimation.html">pcl::ESFEstimation< PointInT, PointOutT ></a>
實作ESF描述子,主要用于實時對三維場景中的點雲模型進行分類而提出的
pcl::Feature< PointInT, PointOutT > 是所有特征相關子產品中其他類的基類
<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_feature_with_local_reference_frames.html">pcl::FeatureWithLocalReferenceFrames< PointInT, PointRFT ></a>
實作FPFH描述子算法主要針對點雲配準過程中對應點而提出的
(關于他的類還有很多可以直接去網站自己檢視)
PCL中描述三維特征相關基礎
理論基礎
在原始表示形式下,點的定義是用笛卡爾坐标系坐标 x, y, z 相對于一個給定的原點來簡單表示的三維映射系統的概念,假定坐标系的原點不随着時間而改變,這裡有兩個點p1和p2分别在時間t1和t2捕獲,有着相同的坐标,對這兩個點作比較其實是屬于不适定問題(ill—posed problem),因為雖然相對于一些距離測度它們是相等的,但是它們取樣于完全不同的表面,是以當把它們和臨近的其他環境中點放在一起時,它們表達着完全不同的資訊,這是因為在t1和t2之間局部環境有可能發生改變。一些擷取裝置也許能夠提供取樣點的額外資料,例如強度或表面反射率等,甚至顔色,然而那并不能完全解決問題,單從兩個點之間來 對比仍然是不适定問題。由于各種不同需求需要進行對比以便能夠區分曲面空間的分布情況,應用軟體要求更好的特征度量方式,是以作為一個單一實體的三維點概念和笛卡爾坐标系被淘汰了,出現了一個新的概念取而代之:局部描述子(locl descriptor)。文獻中對這一概念的描述有許多種不同的命名,如:形狀描述子(shape descriptors)或幾何特征(geometric features),文本中剩餘部分都統稱為點特征表示。通過包括周圍的領域,特征描述子能夠表征采樣表面的幾何 性質,它有助于解決不适定的對比問題,理想情況下相同或相似表面上的點的特征值将非常相似(相對特定度量準則),而不同表面上的點的特征描述子将有明顯差異。下面幾個條件,通過能否獲得相同的局部表面特征值,可以判定點特征表示方式的優劣:
(1) 剛體變換-----即三維旋轉和三維平移變化 不會影響特征向量F估計,即特征向量具有平移選轉不變性。
(2) 改變采樣密度-----原則上,一個局部表面小塊的采樣密度無論是大還是小,都應該有相同的特征向量值,即特征向量具有抗密度幹擾性。
(3) 噪聲---資料中有輕微噪聲的情況下,點特征表示在它的特征向量中必須保持相同或者極其相似的值,即特征向量對點雲噪聲具有穩定性。
通常,PCL中特征向量利用快速kd-tree查詢 ,使用近似法來計算查詢點的最近鄰元素,通常有兩種查詢類型:K鄰域查詢,半徑搜尋兩中方法
法線估計執行個體
一旦确定鄰域以後,查詢點的鄰域點可以用來估計一個局部特征描述子,它用查詢點周圍領域點描述采樣面的幾何特征,描述幾何表面圖形的一個重要屬性,首先是推斷它在坐标系中的方位,也就是估計他的法線,表面法線是表面的一個重要的屬性,在許多領域都有重要的應用,如果用光源來生成符合視覺效果的渲染等,
代碼解析:normal_estimation.cpp
(實作對輸入點雲資料集中的點估計一組表面法線)執行的操作是:對應點雲P中每一個點p得到p點最近鄰元素,計算p點的表面的法線N,檢查N的方向是否指向視點如果不是則翻轉。
視點預設坐标是(0,0,0)可使用setViewPoint(float vpx,float vpy,float vpz)來更換
運作結果并執行:

(2)估計一個點雲的表面法線
表面法線是幾何體表面一個十分重要的屬性,例如:在進行光照渲染時産生符合可視習慣的效果時需要表面法線的資訊才能正常進行,對于一個已經已經知道的幾何體表面,根據垂直于點表面的的矢量,是以推推處表面某一點的法線方向比較容易,然而由于我們擷取的點雲的資料集在真實的物體的表面表現為一組定點的樣本,這樣就會有兩種方法解決:
1 . 使用曲面重建技術,從擷取的點雲資料中得到采樣點對應的曲面,然後從曲面模型中計算出表面法線
2. 直接從點雲資料中近似推斷表面法線
在确定表面一點法線的問題近似于估計表面的一個相切面法線的問題,是以轉換過來就是求一個最小二乘法平面拟合的問題
(3)使用積分圖進行法線估計
使用積分圖計算一個有序的點雲的法線,注意此方法隻适用有序點雲
代碼解析normal_estimation_using_integral_images.cpp
運作結果為:
微信公衆号号可掃描二維碼一起共同學習交流
未完待續*********************8