PCD文件格式
目錄
- 什么是PCD文件
- PCD版本
- ?PCD文件內容
- ?生成PCD文件
- ?python加載PCD文件
什么是PCD文件
?Point Cloud Data,中文譯為點云數據(簡稱PCD),它是一種存儲點云數據的文件格式。其實文件格式有很多種,但是為什么還要重新定義一種新的文件格式呢?那是因為它們都無法滿足PCL(Point Cloud Library)的數據處理需求。在PCD格式被定義之前,表示激光掃描儀獲取的點云、任意多變形的文件格式有:
??PLY:表示多邊形的文件格式;
??STL:CAD文件格式,用3d max或CAD軟件處理;
??OBJ:一種幾何學格式文件;
??X3D:ISO標準的基于XML格式的計算機3D圖形文件格式。
PCD版本
?PCD格式是由多個版本的,如PCD_V5、PCD_V6等,分別表示PCD格式的0.5、0.6兩個版本;而在PCL中使用的版本為PCD_V7(即0.7)版本。
?PCD文件內容
?PCD文件必須用ASCII字符編碼。其文件內容如下所示(PCD_V7):
# .PCD v0.7 - Point Cloud Data file format VERSION 0.7 FIELDS x y z SIZE 4 4 4 TYPE F F F COUNT 1 1 1 WIDTH 5 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS 5 DATA ascii 0.35222197 -0.15188313 -0.10639524 -0.3974061 -0.47310591 0.29260206 -0.73189831 0.66710472 0.44130373 -0.73476553 0.85458088 -0.036173344 -0.46070004 -0.2774682 -0.91676188?從上面的文件信息中可以看到,文件的前11行,主要說明文件存儲點云數據的格式信息。且每個格式的聲明及點云數據之間用\n字符隔開。格式包頭的關鍵字的信息說明如下所示:
# .PCD v0.7 - Point Cloud Data file format //注釋,說明PCD文件的版本 VERSION 0.7 //PCD文件的版本號 FIELDS x y z //每個點應該包含那些維度信息,xyz表示xyz三維坐標,后面可添加rgb(表示顏色)、intensity(表示激光反射強度)、timestamp(表示時間戳)、normal_x/normal_y/normal_z(表示平面法線三維坐標)、j1/j2/j3(表示不變矩) SIZE 4 4 4 //每個維度的數據所占用的字節大小 TYPE F F F //每個維度數據的數據類型;I表示有符號類型、U表示無符號類型、F表示浮點數 COUNT 1 1 1 //每個維度含有多少個元素,默認為1 WIDTH 5 //點云數據集合的寬度,用點的數量表示。含義:1.無序數據集的點云中的點的個數;2.有序點云數據集的寬度,即一行中點的數量 HEIGHT 1 //點云數據集合的高度,用點的數量表示;含義:1.無需點云中數據集中,高度為1(可用于判斷指定數據集是有序還是無序的);2.有序點云數據集的高度,即行的數量 VIEWPOINT 0 0 0 1 0 0 0 //指定數據集合中點的采集視點;可用于后續坐標的轉換,或求平面法線坐標。格式為平移(tx ty tz) 四元數(qw qx qy qz),默認為0 0 0 1 0 0 0 POINTS 5 //點云集合中點的總個數 DATA ascii //點云數據的存儲類型,在0.7版本中支持ascii和binary兩種格式;前兩個版本僅支持ascii格式?備注: 文件格式頭的順序是不能被改變的,即順序一定要是:VERSION FIELDS SIZE TYPE COUNT WIDTH HEIGHT VIEWPOINT POINTS DATA
?生成PCD文件
??參考生成PCD文件中的代碼。
?python加載PCD文件
import open3d as o3d import numpy as np#通過python原生文件接口加載pcd文件 def read_pcd_by_open():pcd_path = "test_pcd.pcd"f = open(pcd_path, 'r')data = f.readlines()for line in data:print("{}".format(line))f.close()#通過open3d庫接口函數加載pcd文件 def read_pcd_by_open3d():pcd_path = "test_pcd.pcd"pcd = o3d.io.read_point_cloud(pcd_path)print("{}".format(np.asarray(pcd.points)))if __name__ == "__main__":read_pcd_by_open3d()print("\n")read_pcd_by_open()總結
- 上一篇: 根据地址获取经纬度 -- 腾讯地图(PH
- 下一篇: ruby工具箱