PCL學習筆記1 —— PCL庫簡要說明

   

本文轉載 https://www.cnblogs.com/li-yao7758258/p/6441763.html

PCL(PointCloudLibrary)是在吸收了前人點雲相關研究基礎上建立起來的大型跨平臺開源C++編程庫,它實現了大量點雲相關的通用算法和高效數據結構,涉及到點雲獲取、濾波、分割、配準、檢索、特徵提取、識別、追蹤、曲面重建、可視化等。支持多種操作系統平臺,可在Windows、Linux、Android、MacOSX、部分嵌入式實時系統上運行。如果說OpenCV是2D信息獲取與處理的結晶,那麼PCL就在3D信息獲取與處理上具有同等地位,PCL是BSD授權方式,可以免費進行商業和學術應用  。

PCL的潛在應用領域

PCL能解決什麼問題呢?

機器人領域移動機器人對其工作環境的有效感知、辨識與認知,是其進行自主行爲優化並可靠完成所承擔任務的前提和基礎。如何實現場景中物體的有效分類與識別是
移動機器人場景認知的核心問題,目前基於視覺圖像處理技術來進行場景的認知是該領域的重要方法。但移動機器人在線獲取的視覺圖像質量受光線變化影響較大,特別是在光線較暗的場景更難以應用,隨着RGBD獲取設備的大量推廣,在機器人領域勢必掀起一股深度信息結合2D信息的應用研究熱潮,深度信息的引入能夠使機器人更好地對環境進行認知、辨識,與圖像信息在機器人領域的應用一樣,需要強大智能軟件算法支撐,PCL就爲此而生,最重要的是PCL本身就是爲機器人而發起的開源項目,PCL中不僅提供了對現有的RGBD信息的獲取設備的支持,還提供了高效的分割、特徵提取、識別、追蹤等最新的算法,最重要的是它可以移植到android、ubuntu等主流Linux平臺上,PCL無疑將會成爲機器人應用領域一把瑞士軍刀。

CAD/CAM、逆向工程

大部分工業產品是根據二維或三維CAD模型製造而成,但有時因爲數據丟失、設計多次更改、實物引進等原因,產品的幾何模型無法獲得,因而常常需要根據現有產品實物生成物體幾何模型。逆向工程技術能夠對產品實物進行測繪,重構產品表面三維幾何模型,生成產品製造所需的數字化文檔。

在一些工業領域,如汽車製造業,許多零件的幾何模型都通過逆向工程由油泥模型或實物零件獲得,目前在CAD/CAM領域利用激光點雲進行高精度測量與重建成爲趨勢,同時引來了新的問題,通過獲取的海量點雲數據,來提取重建模型的幾何參數,或者形狀模型,對模型進行智能檢索,從點雲數據獲取模型的曲面模型等,諸如此類
的問題解決方案在PCL中都有涉及。
例如kdtree和octree對海量點雲進行高效壓縮存儲與管理,其中濾波、配準、特徵描述與提前基礎處理,可以應用於模型的智能檢索,以及後期的曲面重建和可視化都在PCL中有相應的模塊。總之,三維點雲數據的處理是逆向工程中比較重要的一環,PCL中間所有的模塊正是爲此而生的。

激光遙感測量

能夠直接獲取高精度三維地面點數據,是對傳統測量技術在高程數據獲取及自動化快速處理方面的重要技術補充。激光遙感測量系統在地形測繪、環境檢測、三維城市建模、地球科學、行星科學等諸多領域具有廣泛的發展前景,是目前最先進的能實時獲取地形表面三維空間信息和影像的遙感系統。目前,在各種提取地面點的算法中,算法結果與世界結果之間差別較大,違背了實際情況,PCL中強大的模塊可以助力此處的各種需求。

虛擬現實、人機交互虛擬現實技術(簡稱VR),
又稱靈境技術,是以沉浸性、交互性和構想性爲基本特徵的計算機高級人機界面。它綜合利用了計算機圖形學、仿真技術、多媒體技術、人工智能技術、計算機網絡技術、並行處理技術和多傳感器技術,模擬人的視覺、聽覺、觸覺等感覺器官功能,使人能夠沉浸在計算機生成的虛擬境界中,並能夠通過語言、手勢等自然的方式與之進行實時交互,創建了一種適人化的多維信息空間,具有廣闊的應用前景。

對於3D點雲處理來說,PCL完全是一個的模塊化的現代C++模板庫。其基於以下第三方庫:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,實現點雲相關的獲取、濾波、分割、配準、檢索、特徵提取、識別、追蹤、曲面重建、可視化等。PCL利用OpenMP、GPU、CUDA等先進高性能計算技術,通過並行化提高程序實時性。K近鄰搜索操作的構架是基於FLANN(FastLibraryforApproximateNearestNeighbors)所實現的,速度也是目前技術中最快的。PCL中的所有模塊和算法都是通過Boost共享指針來傳送數據的,因而避免了多次複製系統中已存在的數據的需要,從0.6版本開始,PCL就已經被移入到Windows,MacOS和Linux系統,並且在Android系統也已經開始投入使用,這使得PCL的應用容易移植與多方發佈

      PCL包括多個子模塊庫。最重要的PCL模塊庫有如下:過濾器Filters、特徵Features、關鍵點Keypoints、註冊Registration、Kd樹Kd-tree、八叉樹Octree、切分Segmentation、Sample Consensus、Surface、Range Image、文件讀寫I/O、Visualization、通用庫Common、Search

 原文地址:http://pointclouds.org/documentation/tutorials/walkthrough.php#walkthrough

過濾器Filters

 

下圖是一個噪音消除的示例。因爲測量的誤差,某些點集存在大量的陰影點,而這將使得局部點雲的3D特徵建立複雜化。通過對每個點的鄰區 的統計分析,削除未達到一定標準的點,可以將其中一些異常的數據點濾去。在PCL中稀疏噪音的消除方法是在輸入的點集數據中計算各點到其鄰區的分佈概率。 對於每個點,計算其到所有相鄰點的距離,假定其結果應該是符合特定均值和標準差的高斯分佈,定義全局的可容忍的平均值和標準差,將所有不在可容忍誤差內的 點都認爲是噪音點而刪除。

                                                      

特徵Features

在3D特徵教程裏有一個例子展示了特徵的基本理論。

特徵庫包括數據結構和從點雲建立3D特徵的方法。3D特徵爲對於特定點其周圍的可用的幾何關係信息,如特定的三維點、位置或空間。對於查詢點周圍的點雲數據通常簡稱爲k-neighborhood

                                                       

兩個最廣泛使用的幾何點屬性是曲面的曲率估計和查詢點p的法線。利用點的k-neighborhood計算所得的這兩個屬性都可以作爲本地特徵。爲 了確定有效的k-neighborhood點雲數據,輸入的點雲數據通常會按空間劃分爲多個小塊區域,如八叉樹或KD-trees,然後在這些區域中查找 相鄰的點數據。根據具體的應用情況,可以選擇p點附近的固定數量的k個點或者是距離p點r距離內的所有點。毫無疑問,最簡單的計算p點的法線和曲率變化的 方法是在k-neighborhood點曲面中將特徵分解計算(例如分別計算特徵向量和特徵值),當特徵值最小時所相關的特徵向量即可近似爲p點的法向 量,同時曲面的曲率變化可以通過如下公式計算得到:(曲率變化計算不理解其推導過程,後續理解後在詳述)。  

 

關鍵點Keypoints

關鍵點庫含有兩個點雲集的關鍵點檢測算法。關鍵點(也叫做興趣點)是指在一副圖像或者一個點雲集中能夠利用一個明確標準檢測出來的穩定的、獨特的 點。一般情況下關鍵點的數量要遠遠少於點雲集中的點數。通常將關鍵點信息和各個關鍵點的本地特徵信息組合起來形成一組compact—yet descriptive—representation的原始數據。

                                                               

                                                         

註冊Registration

將一些點集數據在統一的世界座標系下組合起來即爲註冊。其關鍵在於確定各個點集之間的關聯點,計算出各個關聯點之間最近似的變換矩陣,對所有的原始數據集不停的重複此過程直到,直到出現各個點集之間的對齊誤差小於指定的閾值,即可認爲註冊過程完成。

註冊庫包含了的大量的點雲註冊算法,其可以處理的點集數據不論是否爲有序。例如,PCL在強註冊算法下,可以將拒絕壞的點集而只將好的點集註冊。

                                                                        

Kd樹Kd-tree

Kd樹的基本原理可以在其基礎教程裏瞭解。

Kd樹庫的基礎數據結構使用了FLANN以便可以快速的進行鄰區搜索。

Kd樹按空間劃分生成葉子節點,各個葉子節點裏存放點數據,其可以按半徑搜索或鄰區搜索。最近鄰區搜索是點雲處理中的一樣核心操作,在點集之間確定關聯點、特徵描述、點的鄰區搜索時都會用到。

                                                                       

八叉樹Octree

 八叉樹庫提供了直接從點雲數據創建樹的方法。其可支持的操作有:空間分割、下采樣、和搜索。每個八叉樹的節點都有八個子節點或者沒有子節點(葉節點)。根節點包含囊括所有點的立方體空間,每層深度的子節點都是上層空間按各軸除2的子空間。

八叉樹通常用來作鄰區搜索,如相鄰區間內搜索、K鄰區搜索、指定半徑內搜索。八叉樹會自動的調整根據點集數據調整其空間尺度。葉節點還提供了一些額 外的操作,如空間的佔有率查詢、每空間單位內的點密度。庫還提供了將八叉樹編碼爲二進制文件以及從二進制文件解析爲八叉樹的功能。此外庫中還使用了內存池 技術減少了頻繁內存的申請和釋放開銷,提高了八叉樹的效率。

下圖展示了一個八叉樹的最底層的子節點空間。每個斯坦福兔表面的點即紅色的點都在八叉樹子節點空間內,這幅圖就是有八叉樹的viewer創建。

                                                                               

切分Segmentation

切分庫包主要爲將一個點雲切分爲多個片段簇。切分最適合處理由一些空間隔離區域組成的點雲,在這種情況下,點雲常常被分解爲一些能夠獨立處理的簇。

關於簇的基本原理可以到其簇的提取教程裏面瞭解。下面兩幅圖分別展示了片面模型(左)的切分和圓柱模型(右)的切分。

                                                                        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章