(1)文件头是文本,以\n换行;
(2)数据部分可以是ASCII也可以是二进制:
(a)从DATA关键字所在的最后一行文件头结束的\n开始,都是点数据;
(b)ASCII形式的点数据:每一点(x y z)占据一个新行(\n结尾),维度数据之间用空格或者TAB键隔开,从PCL1.0.1版本开始,字符串nan表示非法值NAN;
(c)二进制形式的点数据:这里数据是数组(向量)pcl::PointCloud.points的一份完整拷贝,在Linux系统上,我们用mmap/munmap操作来尽可能快地读写数据。
(3)有序点云数据集:
有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。
(4)文件头每行由关键字开头,并且关键字有固定顺序,有以下一些关键字:
VERSION:指定PCD文件版本(例如:0.7)
FIELDS:指定一个点可以有的每一个维度的字段名字(例如:x y z 、x y z rgb)
SIZE:每一个维度的值类型的字节数(例如:4 4 4)
TYPE:每一个维度的值类型(例如:I I F、U U F、F F F、I I I)
COUNT:指定每一个维度包含的元素数目(每个元素还包含1个或者多个值)。例如,x这个维度的通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当做单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置为1。
WIDTH:用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:
(a)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
(b)它能确定有序数据集的宽度(一行中点的数目)。
HEIGHT:用点的数量表示点云数据集的高度。根据是有序点云还是无序点云,WIDTH有两层解释:
(a)对于无序数据集,它被设置为1(被用来检查一个数据集是有序还是无序);
(b)对于有序数据集,它表示有序数据集的高度(行的总数)。
VIEWPOINT:指定数据集中点云的获取视点。VIEWPOINT可能在不同坐标系之间转换的时候应用,在辅助获取其它特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位。
视点信息被指定为平移(txtytz)+四元数(qwqxqyqz),默认值为:VIEWPOINT 0 0 0 1 0 0 0。
POINTS:点云数据集中点的总数,从0.7版本开始,该字段有点多余了,因为根据WIDTH字段和HEIGHT字段可以计算出点的总数,将来的pcd文件版本中可能移除该关键字。
DATA:指定存储点云数据的数据类型。从0.7版本开始,支持两种数据类型:ASCII和二进制。
(5)一个PCD文件的例子:
#Description
FIELDS x y z
SIZE 4 4 4
TYPE F F F
WIDTH 2
HEIGHT 1
POINTS 2
DATA ascii
0.35222 -0.15188 -0.1064
-0.7319 -0.47311 -0.2927