点云数据文件常用格式及PCL中点云数据类型
一、 PCL中點云數據類型
由于采集設備不同時輸入點云信息不同,比如有的只有法向量,有的伴有顏色,強度等信息。必要時,使用者需要自己定義自己的類型。不過先看看PCL庫中定義的點云類型是否已經涵蓋。
1)PointXYZ
pcl::PointCloud<pcl::PointXYZ>
成員變量: float x, y, z;
最常見的一個點數據類型,因為它只包含三維xyz坐標信息, 值得注意的是它多加了一個浮點數來滿足內存對齊
//訪問xyz方式一
float x = cloud.points[i].data[0];
float y = cloud.points[i].data[1];
float z = cloud.points[i].data[2];
//訪問xyz方式二
float x = cloud.points[i].x;
float y = cloud.points[i].y;
float z = cloud.points[i].z;
2)PointXYZI
pcl::PointCloud<pcl::PointXYZI>
成員變量: float x, y, z, intensity; 表示XYZ信息加上強度信息的類型。
3)PointXYZRGBA
pcl::PointCloud<pcl::PointXYZRGBA>
成員變量: float x, y, z; uint32_t rgba;
表示XYZ信息加上RGBA信息,RGBA用32bit的int型存儲的。
4)PointXYZRGB
pcl::PointCloud<pcl::PointXYZRGB>
成員變量: float x, y, z, rgb; 表示XYZ信息加上RGB信息,RGB存儲為一個float。
5)PointXY
成員變量: float x, y;
6)InterestPoint
成員變量: float x, y, z, strength;
除了strength表示關鍵點的強度的測量值,其它的和PointXYZI類似
7)Normal
成員變量: float normal_x,normal_y,normal_z, curvature;
Normal結構體:表示給定點所在樣本曲面上的法線方向,以及對應曲率的測量值,用第四個元素來占位,兼容SSE和高效計算。用戶訪問法向量的第一個坐標,可以通過points[i].data_n[0]或者points[i].normal[0]或者points[i].normal_x,但曲率不能被存儲在同一個結構體中,因為它會被普通的數據操作覆蓋掉。
Eg:PointXYZRGBNormal - float x, y, z, rgb, normal[3], curvature; PointXYZRGBNormal存儲XYZ數據和RGB顏色的point結構體,并且包括曲面法線和曲率。
8)PointNormal
成員變量: float x, y, z,normal_x,normal_y,normal_z, curvature
9)PointXYZRGBNormal
成員變量:float x, y, z, rgb, normal_x,normal_y,normal_z, curvature;
10)PointXYZINormal
成員變量: float x, y, z, intensity, normal_x,normal_y,normal_z, curvature;
11)PointWithRange
成員變量:float x, y, z (union with float point[4]), range;
range包含從所獲得的視點到采樣點的距離測量值之外,其它與PointXYZI類似
12)PointWithViewpoint
成員變量:float x, y, z, vp_x, vp_y, vp_z; p_x、vp_y、vp_z以三維點表示所獲得的視點
13)MomentInvariants
成員變量:float j1, j2, j3; MomentInvariants是一個包含采樣曲面上面片的三個不變矩的point類型,描述面片上質量的分布情況
14)PrincipalRadiiRSD
是一個包含曲面塊上兩個RSD半徑的point類型,查看RSDEstimation以獲得更多信息
點云的數據格式:一般的點云形狀格式為[N, M],其中N是點的個數,M可以類比成圖像中的通道數,如果點云只有x,y,z三個信息,那么M=3。
二、常見點云存儲文件格式簡介
*.las
LiDAR數據的工業標準格式,旨在提供一種開放的格式標準,允許不同的硬件和軟件提供商輸出可互操作的統一格式。是一種二進制文件格式。
一個符合LAS標準的LIDAR文件分為三個部分:公用文件頭塊(PUBLICHEADERBLOCK)、變量長度記(VARIABLELENGTHRECORDS)和點數據記錄(POINTDATARECORD)。
LAS文件包含以下信息:
C--class(所屬類)
F一flight(航線號)
T一time(GPS時間)
I一intensity(回波強度)
R一return(第幾次回波)
N一number of return(回波次數)
A一scan angle(掃描角)
RGB一red green blue(RGB顏色值)
示例:
可以看出,las文件格式除了基本的三維坐標之外,保留了原始掃描的數據采集信息。LAS格式定義中用到的數據類型遵循1999年ANSI(AmericanNationalStandardsInstitute,美國國家標準化協會)C語言標準。
*.obj
OBJ文件是一種標準的3D模型文件格式,很適合用于3D軟件模型之間的互導。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫,不過很多軟件需要通過插件才能做到這一點。
另外,作為一種優秀的文件格式,很多游戲引擎也都支持OBJ文件的讀取。3D軟件模型之間的互導是一件很常見的事情,不幸的是,目前的3D軟件模型導出功能都不那么完美,經常會出現缺面少線的情況,有時還會遇到導出的模型根本打不開的情況。
OBJ文件是一種文本文件格式,比起二進制文件為主、連每個塊的用途也得試探的3DS,文本文件為主的OBJ對我們更友好。與3DS文件的樹狀[塊結構]不同,OBJ文件只是很單純的字典狀結構,沒有塊ID來表征名字而是簡單地用易懂的表意字符來表示。總之看上去是賞心悅目的樣子,而苦處也就只有實際寫導入代碼的時候才知道了。OBJ文件優化了存儲但劣化了讀寫。
OBJ文件不需要任何種文件頭(File Header),盡管經常使用幾行文件信息的注釋作為文件的開頭。通常用以“#”開頭的注釋行作為文件頭。空格和空行可以隨意加到文件中以增加文件的可讀性。有字的行都由一兩個標記字母也就是關鍵字(Keyword)開頭,關鍵字可以說明這一行是什么樣的數據。多行可以邏輯地連接在一起表示一行,方法是在每一行最后添加一個連接符(\)。
注意連接符(\)后面不能出現空格或tab格,否則將導致文件出錯。
對于點云數據來說,其中最基本的兩個關鍵字:
- v 幾何體頂點 (Geometric vertices)
- f 面 (Face)
示例:
一個四邊形的數據表示:
v -0.58 0.84 0
v 2.68 1.17 0
v 2.84 -2.03 0
v -1.92 -2.89 0
f 1 2 3 4
其它元素請參考資料:
3D中的OBJ文件格式詳解 - 勇敢的公爵 - 博客園
*.off
1)相較于 OBJ 文件格式,OFF 文件的存儲信息格式要更為簡單一些。off文件為ASCII文件,以OFF關鍵字開頭。
2)在文件的開頭注明頂點、面片和邊的總數。
3)文件內部只包含頂點和面片的信息,前半部分是頂點坐標,每一行都是由面片的三個頂點的坐標值組成,
4)頂點以x,y,z坐標列出,每個頂點占一行。
5)不同于 OBJ 文件,OFF 文件的后半部分是面片信息,
6)OFF 文件的面片信息的表示很簡單,如 3 a b c,3 在 OFF 文件中相當于OBJ文件中面片的標志 f,a,b,c分別表示組成一個面片的三個頂點的索引號。在頂點列表之后是面列表,每個面占一行。對于每個邊,首先指定其包含的頂點數,隨后是這個面所包含的各頂點在前面頂點列表中的索引。
7)OFF 文件中邊的數量總是忽略不計的,表示為 0。因為 OFF 文件的格式簡單,很多在做三維模型數據輸出的時候,采用 OFF 文件的格式。
OFF文件格式:
OFF
頂點數 面數 邊數
x y z
x y z
…
n個頂點 頂點1的索引 頂點2的索引 … 頂點n的索引
…
示例:(一個立方體)
OFF 8 6 0
-0.500000 -0.500000 0.500000
0.500000 -0.500000 0.500000
-0.500000 0.500000 0.500000
0.500000 0.500000 0.500000
-0.500000 0.500000 -0.500000
0.500000 0.500000 -0.500000
-0.500000 -0.500000 -0.500000
0.500000 -0.500000 -0.500000
4 0 1 3 2
4 2 3 5 4
4 4 5 7 6
4 6 7 1 0
4 1 7 5 3
4 6 0 2 4
*.pcap
一種通用的數據流格式,現在流行的Velodyne公司出品的激光雷達默認采集數據文件格式。它是一種二進制文件。
數據構成結構如下:
整體一個全局頭部(GlobalHeader),然后分成若干個包(Packet),每個包又包含頭部(Header)和數據(Data)部分。
pcap文件格式_Joyce-CSDN博客_pcap格式
*.pcd
PCL庫官方指定格式,典型的為點云量身定制的格式。下文將詳細介紹。
*.ply
一種由斯坦福大學的Turk等人設計開發的多邊形文件格式,因而也被成為斯坦福三角格式。文件格式有文本和二進制兩種格式。
典型的PLY對象定義僅僅是頂點的(x,y,z)三元組列表和由頂點列表中的索引描述的面的列表。
文件結構如下:
· Header (頭部)
· Vertex List (頂點列表)
· Face List (面列表)
· (lists of other elements) (其它元素列表)
示例:
ply
format ascii1.0 ?? { ascii/binary, formatversion number }
comment made byGreg Turk ?? { comments keyword specified,like all lines }
comment thisfile is a cube
element vertex8 ?? { define "vertex"element, 8 of them in file }
property floatx ?? { vertex contains float"x" coordinate }
property floaty ?? { y coordinate is also avertex property }
property floatz ?? { z coordinate, too }
element face6 ???? { there are 6"face" elements in the file }
property listuchar int vertex_index { "vertex_indices" is a list of ints }
end_header ?? { delimits the end of theheader }
0 0 0 ?? { start of vertex list }
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3 ??? { start of face list }
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
MatLab也可以通過pcread函數直接載入該格式。
參考資料:
http://paulbourke.net/dataformats/ply/
PLY文件格式_拉風小宇的博客-CSDN博客_ply文件格式
*.pts
被稱之為最簡便的點云格式,屬于文本格式。只包含點坐標信息,按X Y Z順序存儲,數字之間用空格間隔。
示例:
0.780933-45.9836 -2.47675
4.75189 -38.1508 -4.34072
7.16471 -35.9699 -3.60734
9.12254 -46.1688 -8.60547
15.4418 -46.1823 -9.14635
2.83145 -52.2864 -7.27532
0.160988 -53.076 -5.00516
*.xyz
一種文本格式,前面3個數字表示點坐標,后面3個數字是點的法向量,數字間以空格分隔。
示例:
0.031822 0.0158355 -0.047992 0.000403-0.0620185 -0.005498
-0.002863 -0.0600555 -0.009567 -0.001945 -0.0412555 -0.001349
-0.001867 -0.0423475 -0.0019 0.002323 -0.0617885 -0.00364
三、PCD格式詳解
1、為什么用一種新的文件格式?
PCD文件格式并非白費力氣地做重復工作,現有的文件結構因本身組成的原因不支持由PCL庫引進n維點類型機制處理過程中的某些擴展,而PCD文件格式能夠很好地補足這一點。PCD不是第一個支持3D點云數據的文件類型,尤其是計算機圖形學和計算幾何學領域,已經創建了很多格式來描述任意多邊形和激光掃描儀獲取的點云。包括下面幾種格式:
1)PLY:是一種多邊形文件格式,由Stanford大學的Turk等人設計開發;
2)STL是3D Systems公司創建的模型文件格式,主要應用于CAD、CAM領域;
3)OBJ是從幾何學上定義的文件格式,首先由Wavefront Technologies開發;
4)X3D是符合ISO標準的基于XML的文件格式,表示3D計算機圖形數據;
5)其他許多種格式。
以上所有的文件格式都有缺點,這是很自然的,因為它們是在不同時間為了不同的使用目的所創建的,那時今天的新的傳感器技術和算法都還沒有發明出來。對于其缺點讀者可自行了解。
2、PCD版本
在點云庫(PCL)1.0版本發布之前,PCD文件格式有不同的修訂號。這些修訂號用PCD_Vx來編號(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本號。然而PCL中PCD文件格式的正式發布是0.7版本(PCD_V7)。
3、文件頭格式
每一個PCD文件包含一個文件頭,它確定和聲明文件中存儲的點云數據的某種特性。PCD文件頭必須用ASCII碼來編碼。PCD文件中指定的每一個文件頭字段以及ascii點數據都用一個新行(\n)分開了,從0.7版本開始,PCD文件頭包含下面的字段:
1)VERSION?–指定PCD文件版本,目前PCL中為0.7版本
2)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
...
3)SIZE?–用字節數指定每一個維度的大小。
例如:
unsigned char/char?has 1 byte
unsigned short/short?has 2 bytes
unsignedint/int/float?has 4 bytes
double?has 8 bytes
4)TYPE?–用一個字符指定每一個維度的類型。
現在被接受的類型有:
I?–表示有符號類型int8(char)、int16(short)和int32(int);
U?–?表示無符號類型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F?–表示浮點類型。
5)COUNT?–指定每一個維度包含的元素數目。例如,x這個數據通常有一個元素,但是像VFH這樣的特征描述子就有308個。實際上這是在給每一點引入n維直方圖描述符的方法,把它們當作單個的連續存儲塊。默認情況下,如果沒有COUNT,所有維度的數目被設置成1。
5)WIDTH?–用點的數量表示點云數據集的寬度。根據是有序點云還是無序點云,WIDTH有兩層解釋:
(1)它能確定無序數據集的點云中點的個數(和下面的POINTS一樣);
(2)它能確定有序點云數據集的寬度(一行中點的數目)。
注意:有序點云數據集,意味著點云是類似于圖像(或者矩陣)的結構,數據分為行和列。這種點云的實例包括立體攝像機和時間飛行攝像機生成的數據。有序數據集的優勢在于,預先了解相鄰點(和像素點類似)的關系,鄰域操作更加高效,這樣就加速了計算并降低了PCL中某些算法的成本。
例如:
WIDTH 640?????? #?每行有640個點
6)HEIGHT –用點的數目表示點云數據集的高度。
類似于WIDTH?,HEIGHT也有兩層解釋:
(1)它表示有序點云數據集的高度(行的總數);
(2)對于無序數據集它被設置成1(被用來檢查一個數據集是有序還是無序)。
有序點云例子:
WIDTH 640?????? #?像圖像一樣的有序結構,有640行和480列,
HEIGHT 480????? #?這樣該數據集中共有640*480=307200個點
無序點云例子:
WIDTH 307200
HEIGHT 1??????? #?有307200個點的無序點云數據集
7)VIEWPOINT–指定數據集中點云的獲取視點。VIEWPOINT有可能在不同坐標系之間轉換的時候應用,在輔助獲取其他特征時也比較有用,例如曲面法線,在判斷方向一致性時,需要知道視點的方位,
視點信息被指定為平移(txtytz)+四元數(qwqxqyqz)。默認值是:VIEWPOINT 0 0 0 1 0 0 0
8)POINTS–指定點云中點的總數。從0.7版本開始,該字段就有點多余了,因此有可能在將來的版本中將它移除。
例子:
POINTS 307200?? #點云中點的總數為307200
9)DATA –指定存儲點云數據的數據類型。從0.7版本開始,支持兩種數據類型:ascii和二進制。
注意:文件頭最后一行(DATA)的下一個字節就被看成是點云的數據部分了,它會被解釋為點云數據。
警告:PCD文件的文件頭部分必須以上面的順序精確指定,也就是如下順序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
之間用換行隔開。
4、數據存儲類型
在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等工具來對它們進行操作。
5、相對其他文件格式的優勢
用PCD作為(另一種)文件格式可能被看成是沒有必要的一項工作。但實際中,情況不是這樣的,因為上面提到的文件格式無一能提高PCD文件的適用性和速度。PCD文件格式包括以下幾個明顯的優勢:
1)存儲和處理有序點云數據集的能力——這一點對于實時應用,例如增強現實、機器人學等領域十分重要;
2)二進制mmap/munmap數據類型是把數據下載和存儲到磁盤上最快的方法;
3)可以存儲不同的數據類型(支持所有的基本類型:char,short,int,float,double)——使得點云數據在存儲和處理過程中適應性強并且高效,其中無效的點的通常存儲為NAN類型;
4)特征描述子的n維直方圖——對于3D識別和計算機視覺應用十分重要。
5)另一個優勢是通過控制文件格式,我們能夠使其最大程度上適應PCL,這樣能獲得PCL應用程序的最好性能,而不用把一種不同的文件格式改變成PCL的內部格式,這樣的話通過轉換函數會引起額外的延時。
注意:盡管PCD(點云數據)是PCL中的內部文件格式,pcl_io庫也提供在前面提到的所有其他文件格式中保存和加載數據。
參考:
https://cloud.tencent.com/developer/article/1475778
總結
以上是生活随笔為你收集整理的点云数据文件常用格式及PCL中点云数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win 7 通过事件管理器查看计算机开机
- 下一篇: Eclipse 为jar包加入 Java