什么是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()