一、PCD點云數據存儲格式的進一步認識
(一)PCD點云存儲格式相較于其它存儲格式(如PLY、STL、OBJ、X3D等)的優勢[1]
??????? (1)具有存儲和處理有組織的點云數據集的能力,這對于實時應用和增強現實及機器人等研究領域十分重要;
??????? (2)二進制的mmap/munmap可能是最快加載和存儲數據至磁盤的方式(在實驗中,我發現Linux系統下基于PCL/Open3D庫讀取數據較Windows系統快。后經查閱了解到,二進制格式的點云數據讀取是基于pcl::PointCloud.points array/vector的完全臨時復制。在Linux系統中,為了盡可能最快地讀取數據而采用mmap/munmap操作);
??????? (3)能夠存儲不同的數據類型(支持所有基礎類型,如char、short、int、float和double)以達到高效處理和存儲復雜的點云數據。無效的點云維度通常被存儲為NAN類型,但自從PCL 1.0.1開始,NAN類型字符被替換為nan表示;
??????? (4)支持n-D直方圖特征描述符,這對三維感知和計算機視覺應用十分重要;
??????? (5)通過控制文件格式,PCD存儲格式可以最好地匹配PCL庫,從而在PCL應用中獲得最高的性能表現。與此同時,PCL應用運行不需要將各類數據格式都作為PCL的基礎格式且不需要耗費額外的時間在數據轉換函數上,以提高時空效率。
(二)PCD文件格式頭解析[1]
??????? PCD文件的格式頭用于識別和表明存儲點云數據的確定屬性,格式頭必須為ASCII編碼且每一個屬性實體被換行符(\n)分隔。值得注意的是,視點位置較為重要,視點將會被用于不同坐標系統之間的轉換或者輔助特征計算(如局部表面法線需要一個不變的視線輔助計算保持一致性,即法線定向[8])。
??????? (1)VERSION???????????? PCD格式文件的版本號
??????? (2)FIELDS???????????????? 每一維度的特定屬性標識名字
??????? (3)SIZE????????????????????? 每一維數據存儲的字節數(unsigned char/char為1字節;unsigned short/short為2字節;unsigned int/int/float為4字節;double為8字節)
??????? (4)TYPE???????????????????? 每一維度表示字符的數據類型(I-int8(char)/int16(short)/int32(int) U- uint8(unsigned char)/uint16(unsigned short)/uint32(unsigned int) F-float)
??????? (5)COUNT??????? ????????? 一個維度的表示元素數量。默認不表示COUNT情況,其為1
??????? (6)WIDTH??????????????????? 一行記錄的點的數量
??????? (7)HEIGHT??????????????? (有/無組織存儲標記)若無組織存儲為1,否則為點云數據存儲的行數
??????? (8)VIEWPOINT??????????? 點云數據的視點(tx ty tz qw qx qy qz)
??????? (9)POINTS?????????????????? 存儲點云的總體數量(與WIDTH*HEIGHT一致)
??????? (10)DATA???????????????????? 特定數據格式存儲的點云數據

二、基于KDTree的點云結構化組織
??????? 在計算機科學里,k-d樹(k-dimensional tree)是在k維歐幾里德空間組織點的數據結構,是空間二叉樹的一種特殊情況。k-d樹可以使用在多種應用場合,如多維鍵值搜索(如范圍搜索及最鄰近搜索)。k-d樹是每個葉子節點都為k維點的二叉樹,所有非葉子節點可以視作用一個超平面把空間分割成兩個半空間。節點左邊的子樹代表在超平面左邊的點,節點右邊的子樹代表在超平面右邊的點。選擇超平面的方法如下:每個節點都與k維中垂直于超平面的那一維有關[2]。
????????一個三維樹。第一次劃分(紅色)把根節點(白色)劃分成兩個節點,然后它們分別再次被劃分(綠色)為兩個子節點。最后這四個子節點的每一個都被劃分(藍色)為兩個子節點。因為沒有更進一步的劃分,最后得到的八個節點稱為葉子節點,如圖二所示。

三、點云數據的三維格網化/體素化
??????? 體素(Voxel)是體積像素的簡稱。概念上類似二維空間的最小單位—像素,像素用于二維圖像。體積像素一如其名,是數字資料于三維空間分割上的最小單位[4]。點云數據三維格網化通常用于基于體素的深度學習數據預處理、局部相對特征計算以及投影。

四、基于的Octree的點云結構化組織
??????? 八叉樹(Octree)是一種樹形數據結構,每個內部節點都正好有八個子節點。八叉樹常用于分割三維空間,將其遞歸細分為八個卦限。八叉樹是四叉樹在三維空間中的對應,在三維圖形、三維游戲引擎等領域有很多應用。八叉樹的每個節點都可以代表一個空間,對應的八個子節點則將這個空間細分為八個卦限。點域(point region,簡稱PR)八叉樹的節點中都存儲著一個三維點,即該節點對應區域的“中心”,也是八個子節點對應區域中的一個角落。矩陣(matrix based,簡稱MX)八叉樹中,節點只記錄區域范圍,對應的中心點坐標需要從區域范圍推算。因此,PR八叉樹的根節點可以表示無限大的空間;而MX八叉樹的根節點只能表示有限空間,這樣才可以得到隱含的中心點[6]。

參考資料:
[1] The PCD (Point Cloud Data) file format — Point Cloud Library 1.14.0-dev documentation
[2] https://en.wikipedia.org/wiki/K-d_tree
[3] KDTree - Open3D 0.18.0 documentation
[4] https://en.wikipedia.org/wiki/Voxel
[5] Voxelization - Open3D 0.18.0 documentation
[6] https://en.wikipedia.org/wiki/Octree
[7] Octree - Open3D 0.18.0 documentation
[8] Open3D 法線估計(2)——法線定向_open3d法向量定向-CSDN博客
[9] Open3D KDTree的使用_open3d使用kdtree-CSDN博客
[10] Open3D 從點云中構建八叉樹_根據空間點構造八叉樹-CSDN博客