@
一、為什么用一種新的文件格式?
PCD文件格式並非白費力氣地做重復工作,現有的文件結構因本身組成的原因不支持由PCL庫引進n維點類型機制處理過程中的某些擴展,而PCD文件格式能夠很好地補足這一點。PCD不是第一個支持3D點雲數據的文件類型,尤其是計算機圖形學和計算幾何學領域,已經創建了很多格式來描述任意多邊形和激光掃描儀獲取的點雲。包括下面幾種格式:
PLY | 是一種多邊形文件格式,由Stanford大學的Turk等人設計開發; |
---|---|
STL | 是3D Systems公司創建的模型文件格式,主要應用於CAD、CAM領域; |
OBJ | 是從幾何學上定義的文件格式,首先由Wavefront Technologies開發; |
X3D | 是符合ISO標准的基於XML的文件格式,表示3D計算機圖形數據; |
/ | 其他許多種格式。 |
以上所有的文件格式都有缺點。這是很自然的,因為它們是在不同時間為了不同的使用目的所創建的,那時今天的新的傳感器技術和算法都還沒有發明出來。
二、文件格式
每一個PCD文件包含一個文件頭,它確定和聲明文件中存儲的點雲數據的某種特性。PCD文件頭必須用ASCII碼來編碼。PCD文件中指定的每一個文件頭字段以及ascii點數據都用一個新行(\n)分開了,從0.7版本開始,PCD文件頭包含下面的字段:
2.1·VERSION
指定PCD文件版本
2.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
2.3·SIZE
用字節數指定每一個維度的大小。例如:
unsigned char/char has 1 byte
unsigned short/short has 2 bytes
unsignedint/int/float has 4 bytes
double has 8 bytes
2.4·TYPE
用一個字符指定每一個維度的類型。現在被接受的類型有:
I –表示有符號類型int8(char)、int16(short)和int32(int);
U – 表示無符號類型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F –表示浮點類型。
2.5·COUNT
指定每一個維度包含的元素數目。例如:
x這個數據通常有一個元素,但是像VFH這樣的特征描述子就有308個。實際上這是在給每一點引入n維直方圖描述符的方法,把它們當做單個的連續存儲塊。默認情況下,如果沒有COUNT,所有維度的數目被設置成1。
2.6·WIDTH
用點的數量表示點雲數據集的寬度。根據是有序點雲還是無序點雲,WIDTH有兩層解釋:
- 1)它能確定無序數據集的點雲中點的個數(和下面的POINTS一樣);
- 2)它能確定有序點雲數據集的寬度(一行中點的數目)。
注意:有序點雲數據集,意味着點雲是類似於圖像(或者矩陣)的結構,數據分為行和列。這種點雲的實例包括立體攝像機和時間飛行攝像機生成的數據。有序數據集的優勢在於,預先了解相鄰點(和像素點類似)的關系,鄰域操作更加高效,這樣就加速了計算並降低了PCL中某些算法的成本。
例如:WIDTH 640 # 每行有640個點
2.7·HEIGHT
用點的數目表示點雲數據集的高度。類似於WIDTH ,HEIGHT也有兩層解釋:
- 1)它表示有序點雲數據集的高度(行的總數);
- 2)對於無序數據集它被設置成1(被用來檢查一個數據集是有序還是無序)。
有序點雲例子:
WIDTH 640 # 像圖像一樣的有序結構,有640行和480列,
HEIGHT 480 # 這樣該數據集中共有640*480=307200個點
無序點雲例子:
WIDTH 307200
HEIGHT 1 # 有307200個點的無序點雲數據集
2.8·VIEWPOINT
指定數據集中點雲的獲取視點(原點)。
VIEWPOINT有可能在不同坐標系之間轉換的時候應用,在輔助獲取其他特征時也比較有用,例如曲面法線,在判斷方向一致性時,需要知道視點的方位.
視點信息被指定為平移(txtytz)+四元數(qwqxqyqz)。默認值是:VIEWPOINT 0 0 0 1 0 0 0
2.9·POINTS
指定點雲中點的總數。從0.7版本開始,該字段就有點多余了,因此有可能在將來的版本中將它移除。
例子:
POINTS 307200 #點雲中點的總數為307200
2.10·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等工具來對它們進行操作。
2.11 實例
下面貼出了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
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
三、相對其他文件格式的優勢
用PCD作為(另一種)文件格式可能被看成是沒有必要的一項工作。但實際中,情況不是這樣的,因為上面提到的文件格式無一能提高PCD文件的適用性和速度。PCD文件格式包括以下幾個明顯的優勢:
-
1)存儲和處理有序點雲數據集的能力——這一點對於實時應用,例如增強現實、機器人學等領域十分重要;
-
2)二進制mmap/munmap數據類型是把數據下載和存儲到磁盤上最快的方法;
-
3)存儲不同的數據類型(支持所有的基本類型:char,short,int,float,double)——使得點雲數據在存儲和處理過程中適應性強並且高效,其中無效的點的通常存儲為NAN類型;
-
4)特征描述子的n維直方圖——對於3D識別和計算機視覺應用十分重要。
-
5)另一個優勢是通過控制文件格式,我們能夠使其最大程度上適應PCL,這樣能獲得PCL應用程序的最好性能,而不用把一種不同的文件格式改變成PCL的內部格式,這樣的話通過轉換函數會引起額外的延時。
打賞
碼字不易,如果對您有幫助,就打賞一下吧O(∩_∩)O