PCL(PointCloudLibrary)是在吸取了前人點雲相關研究基礎上創建起來的大型跨平臺開源C++編程庫,它實現了大量點雲相關的通用算法和高效數據結構,涉及到點雲獲取、濾波、分割、配準、檢索、特徵提取、識別、追蹤、曲面重建、可視化等。支持多種操做系統平臺,可在Windows、Linux、Android、MacOSX、部分嵌入式實時系統上運行。若是說OpenCV是2D信息獲取與處理的結晶,那麼PCL就在3D信息獲取與處理上具備同等地位,PCL是BSD受權方式,能夠免費進行商業和學術應用 。
php
PCL的潛在應用領域
PCL能解決什麼問題呢?
機器人領域移動機器人對其工做環境的有效感知、辨識與認知,是其進行自主行爲優化並可靠完成所承擔任務的前提和基礎。如何實現場景中物體的有效分類與識別是
移動機器人場景認知的核心問題,目前基於視覺圖像處理技術來進行場景的認知是該領域的重要方法。但移動機器人在線獲取的視覺圖像質量受光線變化影響較大,特別是在光線較暗的場景更難以應用,隨着RGBD獲取設備的大量推廣,在機器人領域勢必掀起一股深度信息結合2D信息的應用研究熱潮,深度信息的引入可以使機器人更好地對環境進行認知、辨識,與圖像信息在機器人領域的應用同樣,須要強大智能軟件算法支撐,PCL就爲此而生,最重要的是PCL自己就是爲機器人而發起的開源項目,PCL中不只提供了對現有的RGBD信息的獲取設備的支持,還提供了高效的分割、特徵提取、識別、追蹤等最新的算法,最重要的是它能夠移植到android、ubuntu等主流Linux平臺上,PCL無疑將會成爲機器人應用領域一把瑞士軍刀。
CAD/CAM、逆向工程
大部分工業產品是根據二維或三維CAD模型製造而成,但有時由於數據丟失、設計屢次更改、實物引進等緣由,產品的幾何模型沒法得到,於是經常須要根據現有產品實物生成物體幾何模型。逆向工程技術可以對產品實物進行測繪,重構產品表面三維幾何模型,生成產品製造所需的數字化文檔。
在一些工業領域,如汽車製造業,許多零件的幾何模型都經過逆向工程由油泥模型或實物零件得到,目前在CAD/CAM領域利用激光點雲進行高精度測量與重建成爲趨勢,同時引來了新的問題,經過獲取的海量點雲數據,來提取重建模型的幾何參數,或者形狀模型,對模型進行智能檢索,從點雲數據獲取模型的曲面模型等,諸如此類
的問題解決方案在PCL中都有涉及。
例如kdtree和octree對海量點雲進行高效壓縮存儲與管理,其中濾波、配準、特徵描述與提早基礎處理,能夠應用於模型的智能檢索,以及後期的曲面重建和可視化都在PCL中有相應的模塊。總之,三維點雲數據的處理是逆向工程中比較重要的一環,PCL中間全部的模塊正是爲此而生的。
激光遙感測量
可以直接獲取高精度三維地面點數據,是對傳統測量技術在高程數據獲取及自動化快速處理方面的重要技術補充。激光遙感測量系統在地形測繪、環境檢測、三維城市建模、地球科學、行星科學等諸多領域具備普遍的發展前景,是目前最早進的能實時獲取地形表面三維空間信息和影像的遙感系統。目前,在各類提取地面點的算法中,算法結果與世界結果之間差異較大,違背了實際狀況,PCL中強大的模塊能夠助力此處的各類需求。
虛擬現實、人機交互虛擬現實技術(簡稱VR),
又稱靈境技術,是以沉浸性、交互性和構想性爲基本特徵的計算機高級人機界面。它綜合利用了計算機圖形學、仿真技術、多媒體技術、人工智能技術、計算機網絡技術、並行處理技術和多傳感器技術,模擬人的視覺、聽覺、觸覺等感受器官功能,令人可以沉浸在計算機生成的虛擬境界中,並可以經過語言、手勢等天然的方式與之進行實時交互,建立了一種適人化的多維信息空間,具備廣闊的應用前景。android
對於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#walkthroughubuntu
下圖是一個噪音消除的示例。由於測量的偏差,某些點集存在大量的陰影點,而這將使得局部點雲的3D特徵創建複雜化。經過對每一個點的鄰區 的統計分析,削除未達到必定標準的點,能夠將其中一些異常的數據點濾去。在PCL中稀疏噪音的消除方法是在輸入的點集數據中計算各點到其鄰區的分佈機率。 對於每一個點,計算其到全部相鄰點的距離,假定其結果應該是符合特定均值和標準差的高斯分佈,定義全局的可容忍的平均值和標準差,將全部不在可容忍偏差內的 點都認爲是噪音點而刪除。微信
在3D特徵教程裏有一個例子展現了特徵的基本理論。網絡
特徵庫包括數據結構和從點雲創建3D特徵的方法。3D特徵爲對於特定點其周圍的可用的幾何關係信息,如特定的三維點、位置或空間。對於查詢點周圍的點雲數據一般簡稱爲k-neighborhood。數據結構
兩個最普遍使用的幾何點屬性是曲面的曲率估計和查詢點p的法線。利用點的k-neighborhood計算所得的這兩個屬性均可以做爲本地特徵。爲 了肯定有效的k-neighborhood點雲數據,輸入的點雲數據一般會按空間劃分爲多個小塊區域,如八叉樹或KD-trees,而後在這些區域中查找 相鄰的點數據。根據具體的應用狀況,能夠選擇p點附近的固定數量的k個點或者是距離p點r距離內的全部點。毫無疑問,最簡單的計算p點的法線和曲率變化的 方法是在k-neighborhood點曲面中將特徵分解計算(例如分別計算特徵向量和特徵值),當特徵值最小時所相關的特徵向量便可近似爲p點的法向 量,同時曲面的曲率變化能夠經過以下公式計算獲得:(曲率變化計算不理解其推導過程,後續理解後在詳述)。 模塊化
關鍵點庫含有兩個點雲集的關鍵點檢測算法。關鍵點(也叫作興趣點)是指在一副圖像或者一個點雲集中可以利用一個明確標準檢測出來的穩定的、獨特的 點。通常狀況下關鍵點的數量要遠遠少於點雲集中的點數。一般將關鍵點信息和各個關鍵點的本地特徵信息組合起來造成一組compact—yet descriptive—representation的原始數據。性能
將一些點集數據在統一的世界座標系下組合起來即爲註冊。其關鍵在於肯定各個點集之間的關聯點,計算出各個關聯點之間最近似的變換矩陣,對全部的原始數據集不停的重複此過程直到,直到出現各個點集之間的對齊偏差小於指定的閾值,便可認爲註冊過程完成。
註冊庫包含了的大量的點雲註冊算法,其能夠處理的點集數據不管是否爲有序。例如,PCL在強註冊算法下,能夠將拒絕壞的點集而只將好的點集註冊。
Kd樹的基本原理能夠在其基礎教程裏瞭解。
Kd樹庫的基礎數據結構使用了FLANN以即可以快速的進行鄰區搜索。
Kd樹按空間劃分生成葉子節點,各個葉子節點裏存放點數據,其能夠按半徑搜索或鄰區搜索。最近鄰區搜索是點雲處理中的同樣核心操做,在點集之間肯定關聯點、特徵描述、點的鄰區搜索時都會用到。
八叉樹庫提供了直接從點雲數據建立樹的方法。其可支持的操做有:空間分割、下采樣、和搜索。每一個八叉樹的節點都有八個子節點或者沒有子節點(葉節點)。根節點包含囊括全部點的立方體空間,每層深度的子節點都是上層空間按各軸除2的子空間。
八叉樹一般用來做鄰區搜索,如相鄰區間內搜索、K鄰區搜索、指定半徑內搜索。八叉樹會自動的調整根據點集數據調整其空間尺度。葉節點還提供了一些額 外的操做,如空間的佔有率查詢、每空間單位內的點密度。庫還提供了將八叉樹編碼爲二進制文件以及從二進制文件解析爲八叉樹的功能。此外庫中還使用了內存池 技術減小了頻繁內存的申請和釋放開銷,提升了八叉樹的效率。
下圖展現了一個八叉樹的最底層的子節點空間。每一個斯坦福兔表面的點即紅色的點都在八叉樹子節點空間內,這幅圖就是有八叉樹的viewer建立。
切分庫包主要爲將一個點雲切分爲多個片斷簇。切分最適合處理由一些空間隔離區域組成的點雲,在這種狀況下,點雲經常被分解爲一些可以獨立處理的簇。
關於簇的基本原理能夠到其簇的提取教程裏面瞭解。下面兩幅圖分別展現了片面模型(左)的切分和圓柱模型(右)的切分。
備註:關於點雲庫PCL的學習,能夠掃描二維碼關注公衆號,有興趣的能夠直接在公衆號回覆與我交流,相互學習,
有興趣的小夥伴能夠關注微信公衆號,加入QQ或者微信羣,和你們一塊兒交流分享吧