PCL的学习必要性、重要性、意义及最初——持续修改中
??????? 且點云庫是機器人學領域的必備基礎庫,ICRA和IROS的計算機視覺相關一般都使用了PCL庫,PCL庫也成為ROS的基礎部分,與機器人操作系統有了很好的對接。
????? ? 自此,開始了點云庫里被淹沒的苦X生涯。不停地重建、分割、識別、解析語義,分割、抓取..........
???????? 什么是機器人,天曉得!我都沒有見過一個完整功能的機器人!!!Fuck了的世界,對我真是太不公平了
前言:PCL 簡介
??????? 官方主頁:http://pointclouds.org/
?? ? ?? PCL中國:http://www.pclcn.org/? (對于英語語言運用不好的同學,可以參考此網站的資料,比較詳細,英文版的就只是下載一些軟件包)
???????? PCL入門文檔 :http://blog.csdn.net/vbskj/article/details/7556269
官方介紹:
What is PCL?
???? ? ? The Point Cloud Library (orPCL) is alarge scale, open project[1] for 2D/3D image and point cloud processing. The PCL framework contains numerous state-of-the art algorithms including filtering, feature estimation, surface reconstruction, registration, model fitting and segmentation. These algorithms can be used, for example, to filter outliers from noisy data, stitch 3D point clouds together, segment relevant parts of a scene, extract keypoints and compute descriptors to recognize objects in the world based on their geometric appearance, and create surfaces from point clouds and visualize them -- to name a few.
??? ? ?? 點云庫是一個大規模,開放工程的2D,3D處理庫。骨架包括......(更多信息請參考中文網站.....)? ? ?? ? 對于PCL的詳細介紹,可參見 ICRA2011的一篇論文:icra2011?? 3D is here: Point Cloud Library (PCL).此paper里面有詳細的介紹及大致的使用規則.
???????? 我在IEEE上檢索到的一篇paper:Point Cloud Library:Three-DimensionalObject Recognition and 6 DoF Pose Estimation(Robotics & Automation Magazine, IEEE
Volume: 19,Issue: 3) 有一個詳細的使用規則。???
(一):從基礎數據開始
轉自官方網站::http://www.pclcn.org/study/shownews.php?lang=cn&id=54?????
PCD文件(點云數據)格式
?????? 本節描述PCD(點云數據)文件格式。
為什么用一種新的文件格式?
???????? PCD文件格式并非白費力氣地做重復工作,現有的文件結構因本身組成的原因不支持由PCL庫引進n維點類型機制處理過程中的某些擴展,而PCD文件格式能夠很好地補足這一點。PCD不是第一個支持3D點云數據的文件類型,尤其是計算機圖形學和計算幾何學領域,已經創建了很多格式來描述任意多邊形和激光掃描儀獲取的點云。包括下面幾種格式:
????? l?? PLY是一種多邊形文件格式,由Stanford大學的Turk等人設計開發;
????? l? STL是3D Systems公司創建的模型文件格式,主要應用于CAD、CAM領域;
????? l??OBJ是從幾何學上定義的文件格式,首先由Wavefront Technologies開發;
????? l??X3D是符合ISO標準的基于XML的文件格式,表示3D計算機圖形數據;
????? l??其他許多種格式。
以上所有的文件格式都有缺點,在下一節會講到。這是很自然的,因為它們是在不同時間為了不同的使用目的所創建的,那時今天的新的傳感器技術和算法都還沒有發明出來。
我的理解 : 各種維度圖像的邏輯描述形式——我為什么偏愛點云
PCD版本
??????? 在點云庫(PCL)1.0版本發布之前,PCD文件格式有不同的修訂號。這些修訂號用PCD_Vx來編號(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本號。然而PCL中PCD文件格式的正式發布是0.7版本(PCD_V7)。
文件頭格式
?????? 每一個PCD文件包含一個文件頭,它確定和聲明文件中存儲的點云數據的某種特性。PCD文件頭必須用ASCII碼來編碼。PCD文件中指定的每一個文件頭字段以及ascii點數據都用一個新行(\n)分開了,從0.7版本開始,PCD文件頭包含下面的字段:
·VERSION –指定PCD文件版本 ·FIELDS –指定一個點可以有的每一個維度和字段的名字。例如: FIELDS x y z # XYZ data FIELDS x y z rgb # XYZ + colors FIELDS x y z normal_xnormal_y normal_z # XYZ + surface normals FIELDS j1 j2 j3 # moment invariants...
·SIZE?–用字節數指定每一個維度的大小。例如:
unsigned char/char has 1 byte unsigned short/short has 2 bytes unsignedint/int/float has 4 bytes double has 8 bytes·TYPE?–用一個字符指定每一個維度的類型。現在被接受的類型有:
I?–表示有符號類型int8(char)、int16(short)和int32(int);
U?– 表示無符號類型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F?–表示浮點類型。
·COUNT?–指定每一個維度包含的元素數目。例如,x這個數據通常有一個元素,但是像VFH這樣的特征描述子就有308個。實際上這是在給每一點引入n維直方圖描述符的方法,把它們當做單個的連續存儲塊。默認情況下,如果沒有COUNT,所有維度的數目被設置成1。
·WIDTH?–用點的數量表示點云數據集的寬度。根據是有序點云還是無序點云,WIDTH有兩層解釋:
1)它能確定無序數據集的點云中點的個數(和下面的POINTS一樣);
2)它能確定有序點云數據集的寬度(一行中點的數目)。
(注意:有序點云數據集,意味著點云是類似于圖像(或者矩陣)的結構,數據分為行和列。這種點云的實例包括立體攝像機和時間飛行攝像機生成的數據。有序數據集的優勢在于,預先了解相鄰點(和像素點類似)的關系,鄰域操作更加高效,這樣就加速了計算并降低了PCL中某些算法的成本。
例如:
WIDTH 640 # 每行有640個點 ·HEIGHT –用點的數目表示點云數據集的高度。類似于WIDTH ,HEIGHT也有兩層解釋:1)它表示有序點云數據集的高度(行的總數);
2)對于無序數據集它被設置成1(被用來檢查一個數據集是有序還是無序)。
有序點云例子:
WIDTH 640 # 像圖像一樣的有序結構,有640行和480列, HEIGHT 480 # 這樣該數據集中共有640*480=307200個點)無序點云例子:
WIDTH 307200 HEIGHT 1 # 有307200個點的無序點云數據集·VIEWPOINT–指定數據集中點云的獲取視點。VIEWPOINT有可能在不同坐標系之間轉換的時候應用,在輔助獲取其他特征時也比較有用,例如曲面法線,在判斷方向一致性時,需要知道視點的方位,
視點信息被指定為平移(txtytz)+四元數(qwqxqyqz)。默認值是:
VIEWPOINT 0 0 0 1 0 0 0 ·POINTS–指定點云中點的總數。從0.7版本開始,該字段就有點多余了,因此有可能在將來的版本中將它移除。例子:
POINTS 307200 #點云中點的總數為307200 ·DATA –指定存儲點云數據的數據類型。從0.7版本開始,支持兩種數據類型:ascii和二進制。查看下一節可以獲得更多細節。注意:文件頭最后一行(DATA)的下一個字節就被看成是點云的數據部分了,它會被解釋為點云數據。
警告:PCD文件的文件頭部分必須以上面的順序精確指定,也就是如下順序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
之間用換行隔開。
數據存儲類型
在0.7版本中,.PCD文件格式用兩種模式存儲數據:
??????? 如果以ASCII形式,每一點占據一個新行:
p_1 p_2 ... p_n注意:從PCL 1.0.1版本開始,用字符串“nan”表示NaN,此字符表示該點的值不存在或非法等。
?????? 如果以二進制形式,這里數據是數組(向量)pcl::PointCloud.points的一份完整拷貝,在Linux系統上,我們用mmap/munmap操作來盡可能快的讀寫數據,存儲點云數據可以用簡單的ascii形式,每點占據一行,用空格鍵或Tab鍵分開,沒有其他任何字符。也可以用二進制存儲格式,它既簡單又快速,當然這依賴于用戶應用。ascii格式允許用戶打開點云文件,使用例如gunplot這樣的標準軟件工具更改點云文件數據,或者用sed、awk等工具來對它們進行操作。
相對其他文件格式的優勢
?????? 用PCD作為(另一種)文件格式可能被看成是沒有必要的一項工作。但實際中,情況不是這樣的,因為上面提到的文件格式無一能提高PCD文件的適用性和速度。PCD文件格式包括以下幾個明顯的優勢:
??????? l??? 存儲和處理有序點云數據集的能力——這一點對于實時應用,例如增強現實、機器人學等領域十分重要;
?????? l? ??二進制mmap/munmap數據類型是把數據下載和存儲到磁盤上最快的方法;
??????? l? ? 存儲不同的數據類型(支持所有的基本類型:char,short,int,float,double)——使得點云數據在存儲和處理過程中適應性強并且高效,其中無效的點的通常存儲為NAN類型;
??????? l? ??特征描述子的n維直方圖——對于3D識別和計算機視覺應用十分重要。
?????? 另一個優勢是通過控制文件格式,我們能夠使其最大程度上適應PCL,這樣能獲得PCL應用程序的最好性能,而不用把一種不同的文件格式改變成PCL的內部格式,這樣的話通過轉換函數會引起額外的延時。
注意:盡管PCD(點云數據)是PCL中的內部文件格式,pcl_io庫也提供在前面提到的所有其他文件格式中保存和加載數據。
例子
下面貼出了PCD文件的一個片段。把它留給讀者以解析這些數據,看看它的組成,玩的愉快!# .PCD v.7 - Point Cloud Data file format VERSION .7 FIELDS x y z rgb SIZE 4 4 4 4 TYPE F FFF COUNT 1 1 1 1 WIDTH 213 HEIGHT 1 //設置為1,標記為無序點云 VIEWPOINT 0 0 0 1 0 0 0 POINTS 213 //點云中點的總數為213 DATA ascii 0.93773 0.33763 0 4.2108e+06 0.90805 0.35641 0 4.2108e+06Example:格式內容.
A snippet of a PCD file is attached below. It is left to the reader tointerpret the data and see what it means. :) ? Have fun!:
# .PCD v.7 - Point Cloud Data file format VERSION .7 FIELDS x y z rgb SIZE 4 4 4 4 TYPE F F F F COUNT 1 1 1 1 WIDTH 213 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS 213 DATA ascii 0.93773 0.33763 0 4.2108e+06 0.90805 0.35641 0 4.2108e+06 0.81915 0.32 0 4.2108e+06 0.97192 0.278 0 4.2108e+06 0.944 0.29474 0 4.2108e+06 0.98111 0.24247 0 4.2108e+06 0.93655 0.26143 0 4.2108e+06 0.91631 0.27442 0 4.2108e+06 0.81921 0.29315 0 4.2108e+06 0.90701 0.24109 0 4.2108e+06 0.83239 0.23398 0 4.2108e+06 0.99185 0.2116 0 4.2108e+06 0.89264 0.21174 0 4.2108e+06 0.85082 0.21212 0 4.2108e+06 0.81044 0.32222 0 4.2108e+06 0.74459 0.32192 0 4.2108e+06 0.69927 0.32278 0 4.2108e+06 0.8102 0.29315 0 4.2108e+06 0.75504 0.29765 0 4.2108e+06 0.8102 0.24399 0 4.2108e+06 0.74995 0.24723 0 4.2108e+06 0.68049 0.29768 0 4.2108e+06 0.66509 0.29002 0 4.2108e+06 0.69441 0.2526 0 4.2108e+06 0.62807 0.22187 0 4.2108e+06 0.58706 0.32199 0 4.2108e+06 0.52125 0.31955 0 4.2108e+06 0.49351 0.32282 0 4.2108e+06 0.44313 0.32169 0 4.2108e+06 0.58678 0.2929 0 4.2108e+06 0.53436 0.29164 0 4.2108e+06 0.59308 0.24134 0 4.2108e+06 0.5357 0.2444 0 4.2108e+06 0.50043 0.31235 0 4.2108e+06 0.44107 0.29711 0 4.2108e+06 0.50727 0.22193 0 4.2108e+06 0.43957 0.23976 0 4.2108e+06 0.8105 0.21112 0 4.2108e+06 0.73555 0.2114 0 4.2108e+06 -0.85618 0.29497 0 4.2108e+06 -0.79975 0.24326 0 4.2108e+06 -0.8521 0.24246 0 4.2108e+06 -0.91157 0.31224 0 4.2108e+06 -0.95031 0.29572 0 4.2108e+06 -0.92223 0.2213 0 4.2108e+06 -0.94979 0.24354 0 4.2108e+06 -0.78641 0.21505 0 4.2108e+06 -0.87094 0.21237 0 4.2108e+06 -0.90637 0.20934 0 4.2108e+06 -0.93777 0.21481 0 4.2108e+06 0.22244 -0.0296 0 4.808e+06 0.2704 -0.078167 0 4.808e+06 ?敬請關注PCL(Point Cloud Learning)中國更多的點云庫PCL(Point Cloud Library)相關官方教程。
(二)PCL庫的模塊
簡單介紹:http://qing.blog.sina.com.cn/1455173150/56bc2e1e330005pk.html
??????? PCL is released under the terms of the 3-clause BSD license and is open source software. It is free for commercial and research use.
?? ? ? PCL is cross-platform, and has been successfully compiled and deployed on Linux, MacOS, Windows, andAndroid/iOS. To simplify development, PCL is split into a series of smaller code libraries, that can be compiled separately. This modularity is important for distributing PCL on platforms with reduced computational or size constraints (for more information about each module see the documentation page). Another way to think about PCL is as a graph of code libraries, similar to theBoost set of C++ libraries. Here's an example:
pcl的子模塊們 pcl_filters ? ? ? ? ? ? ? ? ? ? 去除噪點 pcl_features??????????????? 三維特征提取 pcl_registration ? ? ? ? ? 將點云融合到一個全局模型中 pcl_kdtree?????????????????? 基于FLANN的kdtree實現最近鄰搜索 pcl_octree?????????????????? 基于八叉樹實現最近鄰搜索 pcl_segmentation?????? 分割點云 pcl_sample_consensus? 對點云進行擬合(線、面、園、球、柱面、平行線),擬合算法包括: * SAC_RANSAC - RANdom SAmple Consensus * SAC_LMEDS - Least Median of Squares * SAC_MSAC - M-Estimator SAmple Consensus * SAC_RRANSAC - Randomized RANSAC * SAC_RMSAC - Randomized MSAC * SAC_MLESAC - Maximum LikeLihood Estimation SAmple Consensus * SAC_PROSAC - PROgressive SAmple Consensus pcl_surface???????????????????????????? 從三維掃描重建表面,可以是mesh/convex hull/concave hull pcl_range_image ?????????????????? 深度圖,由kinect獲取后可轉換為點云 pcl_io?????????????????????????????????????? 輸入輸出,PCD (Point Cloud Data) 文件的讀寫,OpenNI的接口(沒有實現微軟SDK的接口) pcl_visualization????????????????????? 類似于OpenCV中highgui的作用,基于VTK實現三維可視化(VTK是一個極其龐大的庫)
因此有了庫:
必需的庫有: boost??????? C++的高級版本庫
Eigen?????? 矩陣計算庫,主要用于位姿計算
FLANN???? 近似最近鄰查詢,用于匹配和模式識別
可選項有: VTK,用于pcl_visualization????? PCL的顯示庫,可是實時顯示點云
QHull,用于pcl_surface?????????? 多邊形計算庫,可以計算PLY格式點云
OpenNI,用于pcl_io??????????????? ? I/O關系,得到PLY格式點云,可以自行轉化為PCD格式
CUDA??????????????????????????????????????? 加速計算庫
后記: 使用PCL庫時,要選取一塊好的NVIDIA顯卡.....................
總結
以上是生活随笔為你收集整理的PCL的学习必要性、重要性、意义及最初——持续修改中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快手APP如何创建合集(最新快手APP下
- 下一篇: uc浏览器怎么取消自动续费