PCL的学习必要性、重要性、意义及最初——持续修改中
??????? 且點(diǎn)云庫是機(jī)器人學(xué)領(lǐng)域的必備基礎(chǔ)庫,ICRA和IROS的計算機(jī)視覺相關(guān)一般都使用了PCL庫,PCL庫也成為ROS的基礎(chǔ)部分,與機(jī)器人操作系統(tǒng)有了很好的對接。
????? ? 自此,開始了點(diǎn)云庫里被淹沒的苦X生涯。不停地重建、分割、識別、解析語義,分割、抓取..........
???????? 什么是機(jī)器人,天曉得!我都沒有見過一個完整功能的機(jī)器人!!!Fuck了的世界,對我真是太不公平了
前言:PCL 簡介
??????? 官方主頁:http://pointclouds.org/
?? ? ?? PCL中國:http://www.pclcn.org/? (對于英語語言運(yùn)用不好的同學(xué),可以參考此網(wǎng)站的資料,比較詳細(xì),英文版的就只是下載一些軟件包)
???????? 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.
??? ? ?? 點(diǎn)云庫是一個大規(guī)模,開放工程的2D,3D處理庫。骨架包括......(更多信息請參考中文網(wǎng)站.....)? ? ?? ? 對于PCL的詳細(xì)介紹,可參見 ICRA2011的一篇論文:icra2011?? 3D is here: Point Cloud Library (PCL).此paper里面有詳細(xì)的介紹及大致的使用規(guī)則.
???????? 我在IEEE上檢索到的一篇paper:Point Cloud Library:Three-DimensionalObject Recognition and 6 DoF Pose Estimation(Robotics & Automation Magazine, IEEE
Volume: 19,Issue: 3) 有一個詳細(xì)的使用規(guī)則。???
(一):從基礎(chǔ)數(shù)據(jù)開始
轉(zhuǎn)自官方網(wǎng)站::http://www.pclcn.org/study/shownews.php?lang=cn&id=54?????
PCD文件(點(diǎn)云數(shù)據(jù))格式
?????? 本節(jié)描述PCD(點(diǎn)云數(shù)據(jù))文件格式。
為什么用一種新的文件格式?
???????? PCD文件格式并非白費(fèi)力氣地做重復(fù)工作,現(xiàn)有的文件結(jié)構(gòu)因本身組成的原因不支持由PCL庫引進(jìn)n維點(diǎn)類型機(jī)制處理過程中的某些擴(kuò)展,而PCD文件格式能夠很好地補(bǔ)足這一點(diǎn)。PCD不是第一個支持3D點(diǎn)云數(shù)據(jù)的文件類型,尤其是計算機(jī)圖形學(xué)和計算幾何學(xué)領(lǐng)域,已經(jīng)創(chuàng)建了很多格式來描述任意多邊形和激光掃描儀獲取的點(diǎn)云。包括下面幾種格式:
????? l?? PLY是一種多邊形文件格式,由Stanford大學(xué)的Turk等人設(shè)計開發(fā);
????? l? STL是3D Systems公司創(chuàng)建的模型文件格式,主要應(yīng)用于CAD、CAM領(lǐng)域;
????? l??OBJ是從幾何學(xué)上定義的文件格式,首先由Wavefront Technologies開發(fā);
????? l??X3D是符合ISO標(biāo)準(zhǔn)的基于XML的文件格式,表示3D計算機(jī)圖形數(shù)據(jù);
????? l??其他許多種格式。
以上所有的文件格式都有缺點(diǎn),在下一節(jié)會講到。這是很自然的,因為它們是在不同時間為了不同的使用目的所創(chuàng)建的,那時今天的新的傳感器技術(shù)和算法都還沒有發(fā)明出來。
我的理解 : 各種維度圖像的邏輯描述形式——我為什么偏愛點(diǎn)云
PCD版本
??????? 在點(diǎn)云庫(PCL)1.0版本發(fā)布之前,PCD文件格式有不同的修訂號。這些修訂號用PCD_Vx來編號(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本號。然而PCL中PCD文件格式的正式發(fā)布是0.7版本(PCD_V7)。
文件頭格式
?????? 每一個PCD文件包含一個文件頭,它確定和聲明文件中存儲的點(diǎn)云數(shù)據(jù)的某種特性。PCD文件頭必須用ASCII碼來編碼。PCD文件中指定的每一個文件頭字段以及ascii點(diǎn)數(shù)據(jù)都用一個新行(\n)分開了,從0.7版本開始,PCD文件頭包含下面的字段:
·VERSION –指定PCD文件版本 ·FIELDS –指定一個點(diǎn)可以有的每一個維度和字段的名字。例如: 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?–用字節(jié)數(shù)指定每一個維度的大小。例如:
unsigned char/char has 1 byte unsigned short/short has 2 bytes unsignedint/int/float has 4 bytes double has 8 bytes·TYPE?–用一個字符指定每一個維度的類型。現(xiàn)在被接受的類型有:
I?–表示有符號類型int8(char)、int16(short)和int32(int);
U?– 表示無符號類型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F?–表示浮點(diǎn)類型。
·COUNT?–指定每一個維度包含的元素數(shù)目。例如,x這個數(shù)據(jù)通常有一個元素,但是像VFH這樣的特征描述子就有308個。實際上這是在給每一點(diǎn)引入n維直方圖描述符的方法,把它們當(dāng)做單個的連續(xù)存儲塊。默認(rèn)情況下,如果沒有COUNT,所有維度的數(shù)目被設(shè)置成1。
·WIDTH?–用點(diǎn)的數(shù)量表示點(diǎn)云數(shù)據(jù)集的寬度。根據(jù)是有序點(diǎn)云還是無序點(diǎn)云,WIDTH有兩層解釋:
1)它能確定無序數(shù)據(jù)集的點(diǎn)云中點(diǎn)的個數(shù)(和下面的POINTS一樣);
2)它能確定有序點(diǎn)云數(shù)據(jù)集的寬度(一行中點(diǎn)的數(shù)目)。
(注意:有序點(diǎn)云數(shù)據(jù)集,意味著點(diǎn)云是類似于圖像(或者矩陣)的結(jié)構(gòu),數(shù)據(jù)分為行和列。這種點(diǎn)云的實例包括立體攝像機(jī)和時間飛行攝像機(jī)生成的數(shù)據(jù)。有序數(shù)據(jù)集的優(yōu)勢在于,預(yù)先了解相鄰點(diǎn)(和像素點(diǎn)類似)的關(guān)系,鄰域操作更加高效,這樣就加速了計算并降低了PCL中某些算法的成本。
例如:
WIDTH 640 # 每行有640個點(diǎn) ·HEIGHT –用點(diǎn)的數(shù)目表示點(diǎn)云數(shù)據(jù)集的高度。類似于WIDTH ,HEIGHT也有兩層解釋:1)它表示有序點(diǎn)云數(shù)據(jù)集的高度(行的總數(shù));
2)對于無序數(shù)據(jù)集它被設(shè)置成1(被用來檢查一個數(shù)據(jù)集是有序還是無序)。
有序點(diǎn)云例子:
WIDTH 640 # 像圖像一樣的有序結(jié)構(gòu),有640行和480列, HEIGHT 480 # 這樣該數(shù)據(jù)集中共有640*480=307200個點(diǎn))無序點(diǎn)云例子:
WIDTH 307200 HEIGHT 1 # 有307200個點(diǎn)的無序點(diǎn)云數(shù)據(jù)集·VIEWPOINT–指定數(shù)據(jù)集中點(diǎn)云的獲取視點(diǎn)。VIEWPOINT有可能在不同坐標(biāo)系之間轉(zhuǎn)換的時候應(yīng)用,在輔助獲取其他特征時也比較有用,例如曲面法線,在判斷方向一致性時,需要知道視點(diǎn)的方位,
視點(diǎn)信息被指定為平移(txtytz)+四元數(shù)(qwqxqyqz)。默認(rèn)值是:
VIEWPOINT 0 0 0 1 0 0 0 ·POINTS–指定點(diǎn)云中點(diǎn)的總數(shù)。從0.7版本開始,該字段就有點(diǎn)多余了,因此有可能在將來的版本中將它移除。例子:
POINTS 307200 #點(diǎn)云中點(diǎn)的總數(shù)為307200 ·DATA –指定存儲點(diǎn)云數(shù)據(jù)的數(shù)據(jù)類型。從0.7版本開始,支持兩種數(shù)據(jù)類型:ascii和二進(jìn)制。查看下一節(jié)可以獲得更多細(xì)節(jié)。注意:文件頭最后一行(DATA)的下一個字節(jié)就被看成是點(diǎn)云的數(shù)據(jù)部分了,它會被解釋為點(diǎn)云數(shù)據(jù)。
警告:PCD文件的文件頭部分必須以上面的順序精確指定,也就是如下順序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
之間用換行隔開。
數(shù)據(jù)存儲類型
在0.7版本中,.PCD文件格式用兩種模式存儲數(shù)據(jù):
??????? 如果以ASCII形式,每一點(diǎn)占據(jù)一個新行:
p_1 p_2 ... p_n注意:從PCL 1.0.1版本開始,用字符串“nan”表示NaN,此字符表示該點(diǎn)的值不存在或非法等。
?????? 如果以二進(jìn)制形式,這里數(shù)據(jù)是數(shù)組(向量)pcl::PointCloud.points的一份完整拷貝,在Linux系統(tǒng)上,我們用mmap/munmap操作來盡可能快的讀寫數(shù)據(jù),存儲點(diǎn)云數(shù)據(jù)可以用簡單的ascii形式,每點(diǎn)占據(jù)一行,用空格鍵或Tab鍵分開,沒有其他任何字符。也可以用二進(jìn)制存儲格式,它既簡單又快速,當(dāng)然這依賴于用戶應(yīng)用。ascii格式允許用戶打開點(diǎn)云文件,使用例如gunplot這樣的標(biāo)準(zhǔn)軟件工具更改點(diǎn)云文件數(shù)據(jù),或者用sed、awk等工具來對它們進(jìn)行操作。
相對其他文件格式的優(yōu)勢
?????? 用PCD作為(另一種)文件格式可能被看成是沒有必要的一項工作。但實際中,情況不是這樣的,因為上面提到的文件格式無一能提高PCD文件的適用性和速度。PCD文件格式包括以下幾個明顯的優(yōu)勢:
??????? l??? 存儲和處理有序點(diǎn)云數(shù)據(jù)集的能力——這一點(diǎn)對于實時應(yīng)用,例如增強(qiáng)現(xiàn)實、機(jī)器人學(xué)等領(lǐng)域十分重要;
?????? l? ??二進(jìn)制mmap/munmap數(shù)據(jù)類型是把數(shù)據(jù)下載和存儲到磁盤上最快的方法;
??????? l? ? 存儲不同的數(shù)據(jù)類型(支持所有的基本類型:char,short,int,float,double)——使得點(diǎn)云數(shù)據(jù)在存儲和處理過程中適應(yīng)性強(qiáng)并且高效,其中無效的點(diǎn)的通常存儲為NAN類型;
??????? l? ??特征描述子的n維直方圖——對于3D識別和計算機(jī)視覺應(yīng)用十分重要。
?????? 另一個優(yōu)勢是通過控制文件格式,我們能夠使其最大程度上適應(yīng)PCL,這樣能獲得PCL應(yīng)用程序的最好性能,而不用把一種不同的文件格式改變成PCL的內(nèi)部格式,這樣的話通過轉(zhuǎn)換函數(shù)會引起額外的延時。
注意:盡管PCD(點(diǎn)云數(shù)據(jù))是PCL中的內(nèi)部文件格式,pcl_io庫也提供在前面提到的所有其他文件格式中保存和加載數(shù)據(jù)。
例子
下面貼出了PCD文件的一個片段。把它留給讀者以解析這些數(shù)據(jù),看看它的組成,玩的愉快!# .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 //設(shè)置為1,標(biāo)記為無序點(diǎn)云 VIEWPOINT 0 0 0 1 0 0 0 POINTS 213 //點(diǎn)云中點(diǎn)的總數(shù)為213 DATA ascii 0.93773 0.33763 0 4.2108e+06 0.90805 0.35641 0 4.2108e+06Example:格式內(nèi)容.
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 ?敬請關(guān)注PCL(Point Cloud Learning)中國更多的點(diǎn)云庫PCL(Point Cloud Library)相關(guān)官方教程。
(二)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 ? ? ? ? ? ? ? ? ? ? 去除噪點(diǎn) pcl_features??????????????? 三維特征提取 pcl_registration ? ? ? ? ? 將點(diǎn)云融合到一個全局模型中 pcl_kdtree?????????????????? 基于FLANN的kdtree實現(xiàn)最近鄰搜索 pcl_octree?????????????????? 基于八叉樹實現(xiàn)最近鄰搜索 pcl_segmentation?????? 分割點(diǎn)云 pcl_sample_consensus? 對點(diǎn)云進(jìn)行擬合(線、面、園、球、柱面、平行線),擬合算法包括: * 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獲取后可轉(zhuǎn)換為點(diǎn)云 pcl_io?????????????????????????????????????? 輸入輸出,PCD (Point Cloud Data) 文件的讀寫,OpenNI的接口(沒有實現(xiàn)微軟SDK的接口) pcl_visualization????????????????????? 類似于OpenCV中highgui的作用,基于VTK實現(xiàn)三維可視化(VTK是一個極其龐大的庫)
因此有了庫:
必需的庫有: boost??????? C++的高級版本庫
Eigen?????? 矩陣計算庫,主要用于位姿計算
FLANN???? 近似最近鄰查詢,用于匹配和模式識別
可選項有: VTK,用于pcl_visualization????? PCL的顯示庫,可是實時顯示點(diǎn)云
QHull,用于pcl_surface?????????? 多邊形計算庫,可以計算PLY格式點(diǎn)云
OpenNI,用于pcl_io??????????????? ? I/O關(guān)系,得到PLY格式點(diǎn)云,可以自行轉(zhuǎn)化為PCD格式
CUDA??????????????????????????????????????? 加速計算庫
后記: 使用PCL庫時,要選取一塊好的NVIDIA顯卡.....................
總結(jié)
以上是生活随笔為你收集整理的PCL的学习必要性、重要性、意义及最初——持续修改中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快手APP如何创建合集(最新快手APP下
- 下一篇: 计算机视觉会议与专家(重排版)