本節描述PCD(點雲數據)文件格式。
為什么用一種新的文件格式?
PCD文件格式並非白費力氣地做重復工作,現有的文件結構因本身組成的原因不支持由PCL庫引進n維點類型機制處理過程中的某些擴展,而PCD文件格式能夠很好地補足這一點。PCD不是第一個支持3D點雲數據的文件類型,尤其是計算機圖形學和計算幾何學領域,已經創建了很多格式來描述任意多邊形和激光掃描儀獲取的點雲。包括下面幾種格式:
PLY是一種多邊形文件格式,由Stanford大學的Turk等人設計開發;
STL是3D Systems公司創建的模型文件格式,主要應用於CAD、CAM領域;
OBJ是從幾何學上定義的文件格式,首先由Wavefront Technologies開發;
X3D是符合ISO標准的基於XML的文件格式,表示3D計算機圖形數據;
其他許多種格式。
以上所有的文件格式都有缺點,在下一節會講到。這是很自然的,因為它們是在不同時間為了不同的使用目的所創建的,那時今天的新的傳感器技術和算法都還沒有發明出來。
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 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.69907 0.21082 0 4.2108e+06 0.63327 0.21154 0 4.2108e+06 0.59165 0.21201 0 4.2108e+06 0.52477 0.21491 0 4.2108e+06 0.49375 0.21006 0 4.2108e+06 0.4384 0.19632 0 4.2108e+06 0.43425 0.16052 0 4.2108e+06 0.3787 0.32173 0 4.2108e+06 0.33444 0.3216 0 4.2108e+06 0.23815 0.32199 0 4.808e+06 0.3788 0.29315 0 4.2108e+06 0.33058 0.31073 0 4.2108e+06 0.3788 0.24399 0 4.2108e+06 0.30249 0.29189 0 4.2108e+06 0.23492 0.29446 0 4.808e+06 0.29465 0.24399 0 4.2108e+06 0.23514 0.24172 0 4.808e+06 0.18836 0.32277 0 4.808e+06 0.15992 0.32176 0 4.808e+06 0.08642 0.32181 0 4.808e+06 0.039994 0.32283 0 4.808e+06 0.20039 0.31211 0 4.808e+06 0.1417 0.29506 0 4.808e+06 0.20921 0.22332 0 4.808e+06 0.13884 0.24227 0 4.808e+06 0.085123 0.29441 0 4.808e+06 0.048446 0.31279 0 4.808e+06 0.086957 0.24399 0 4.808e+06 0.3788 0.21189 0 4.2108e+06 0.29465 0.19323 0 4.2108e+06 0.23755 0.19348 0 4.808e+06 0.29463 0.16054 0 4.2108e+06 0.23776 0.16054 0 4.808e+06 0.19016 0.21038 0 4.808e+06 0.15704 0.21245 0 4.808e+06 0.08678 0.21169 0 4.808e+06 0.012746 0.32168 0 4.808e+06 -0.075715 0.32095 0 4.808e+06 -0.10622 0.32304 0 4.808e+06 -0.16391 0.32118 0 4.808e+06 0.00088411 0.29487 0 4.808e+06 -0.057568 0.29457 0 4.808e+06 -0.0034333 0.24399 0 4.808e+06 -0.055185 0.24185 0 4.808e+06 -0.10983 0.31352 0 4.808e+06 -0.15082 0.29453 0 4.808e+06 -0.11534 0.22049 0 4.808e+06 -0.15155 0.24381 0 4.808e+06 -0.1912 0.32173 0 4.808e+06 -0.281 0.3185 0 4.808e+06 -0.30791 0.32307 0 4.808e+06 -0.33854 0.32148 0 4.808e+06 -0.21248 0.29805 0 4.808e+06 -0.26372 0.29905 0 4.808e+06 -0.22562 0.24399 0 4.808e+06 -0.25035 0.2371 0 4.808e+06 -0.29941 0.31191 0 4.808e+06 -0.35845 0.2954 0 4.808e+06 -0.29231 0.22236 0 4.808e+06 -0.36101 0.24172 0 4.808e+06 -0.0034393 0.21129 0 4.808e+06 -0.07306 0.21304 0 4.808e+06 -0.10579 0.2099 0 4.808e+06 -0.13642 0.21411 0 4.808e+06 -0.22562 0.19323 0 4.808e+06 -0.24439 0.19799 0 4.808e+06 -0.22591 0.16041 0 4.808e+06 -0.23466 0.16082 0 4.808e+06 -0.3077 0.20998 0 4.808e+06 -0.3413 0.21239 0 4.808e+06 -0.40551 0.32178 0 4.2108e+06 -0.50568 0.3218 0 4.2108e+06 -0.41732 0.30844 0 4.2108e+06 -0.44237 0.28859 0 4.2108e+06 -0.41591 0.22004 0 4.2108e+06 -0.44803 0.24236 0 4.2108e+06 -0.50623 0.29315 0 4.2108e+06 -0.50916 0.24296 0 4.2108e+06 -0.57019 0.22334 0 4.2108e+06 -0.59611 0.32199 0 4.2108e+06 -0.65104 0.32199 0 4.2108e+06 -0.72566 0.32129 0 4.2108e+06 -0.75538 0.32301 0 4.2108e+06 -0.59653 0.29315 0 4.2108e+06 -0.65063 0.29315 0 4.2108e+06 -0.59478 0.24245 0 4.2108e+06 -0.65063 0.24399 0 4.2108e+06 -0.70618 0.29525 0 4.2108e+06 -0.76203 0.31284 0 4.2108e+06 -0.70302 0.24183 0 4.2108e+06 -0.77062 0.22133 0 4.2108e+06 -0.41545 0.21099 0 4.2108e+06 -0.45004 0.19812 0 4.2108e+06 -0.4475 0.1673 0 4.2108e+06 -0.52031 0.21236 0 4.2108e+06 -0.55182 0.21045 0 4.2108e+06 -0.5965 0.21131 0 4.2108e+06 -0.65064 0.2113 0 4.2108e+06 -0.72216 0.21286 0 4.2108e+06 -0.7556 0.20987 0 4.2108e+06 -0.78343 0.31973 0 4.2108e+06 -0.87572 0.32111 0 4.2108e+06 -0.90519 0.32263 0 4.2108e+06 -0.95526 0.34127 0 4.2108e+06 -0.79774 0.29271 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 0.24416 -0.056883 0 4.808e+06 0.27311 -0.10653 0 4.808e+06 0.26172 -0.10653 0 4.808e+06 0.2704 -0.1349 0 4.808e+06 0.24428 -0.15599 0 4.808e+06 0.19017 -0.025297 0 4.808e+06 0.14248 -0.02428 0 4.808e+06 0.19815 -0.037432 0 4.808e+06 0.14248 -0.03515 0 4.808e+06 0.093313 -0.02428 0 4.808e+06 0.044144 -0.02428 0 4.808e+06 0.093313 -0.03515 0 4.808e+06 0.044144 -0.03515 0 4.808e+06 0.21156 -0.17357 0 4.808e+06 0.029114 -0.12594 0 4.2108e+06 0.036583 -0.15619 0 4.2108e+06 0.22446 -0.20514 0 4.808e+06 0.2208 -0.2369 0 4.808e+06 0.2129 -0.208 0 4.808e+06 0.19316 -0.25672 0 4.808e+06 0.14497 -0.27484 0 4.808e+06 0.030167 -0.18748 0 4.2108e+06 0.1021 -0.27453 0 4.808e+06 0.1689 -0.2831 0 4.808e+06 0.13875 -0.28647 0 4.808e+06 0.086993 -0.29568 0 4.808e+06 0.044924 -0.3154 0 4.808e+06 -0.0066125 -0.02428 0 4.808e+06 -0.057362 -0.02428 0 4.808e+06 -0.0066125 -0.03515 0 4.808e+06 -0.057362 -0.03515 0 4.808e+06 -0.10653 -0.02428 0 4.808e+06 -0.15266 -0.025282 0 4.808e+06 -0.10653 -0.03515 0 4.808e+06 -0.16036 -0.037257 0 4.808e+06 0.0083286 -0.1259 0 4.2108e+06 0.0007442 -0.15603 0 4.2108e+06 -0.1741 -0.17381 0 4.808e+06 -0.18502 -0.02954 0 4.808e+06 -0.20707 -0.056403 0 4.808e+06 -0.23348 -0.07764 0 4.808e+06 -0.2244 -0.10653 0 4.808e+06 -0.23604 -0.10652 0 4.808e+06 -0.20734 -0.15641 0 4.808e+06 -0.23348 -0.13542 0 4.808e+06 0.0061083 -0.18729 0 4.2108e+06 -0.066235 -0.27472 0 4.808e+06 -0.17577 -0.20789 0 4.808e+06 -0.10861 -0.27494 0 4.808e+06 -0.15584 -0.25716 0 4.808e+06 -0.0075775 -0.31546 0 4.808e+06 -0.050817 -0.29595 0 4.808e+06 -0.10306 -0.28653 0 4.808e+06 -0.1319 -0.2831 0 4.808e+06 -0.18716 -0.20571 0 4.808e+06 -0.18369 -0.23729 0 4.808e+06
英文原文:https://pointclouds.org/documentation/tutorials/pcd_file_format.html
