第四章输入/输出(I/O)4.2PCL中I/O模块及类介绍
PCL中I/O库提供了点云文件输入输出相关的操作类,并封装了OpenNI兼容的设备源数据获取接口,可直接从众多感知设备获取点云图像等数据。I/O模块利用21个类和28个函数实现了对点云的获取、读入、存储等相关操作,其依赖于pcl_common和pcl_octree模块以及OpenNI外部开发包。
1、PCD(点云数据)文件格式
PCL中正式发布的PCD文件格式是0.7版本(PCD_V7)
文件头格式
每一个PCD文件都包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ASCII点数据都用一个新行(\n)分开了,PCD文件头包含下面的这些字段:
VERSION:指定PCD文件版本
FIELDS:指定一个点可以有的每一个维度和字段的名字。例如
FIELDS x y z # XYZ data
FIELDS x y z rgb #XYZ + colors
SIZE:用字节数指定每一个维度的大小。例如
unsigned char/char has 1 byte
unsigned short/short has 2 bytes
unsigned int /int hs 4 bytes
double has 8 bytes
TYPE:用一个字符指定每一个维度的类型。
I表示有符号类型,U表示无符号类型,F表示浮点类型
COUNT:指定每一个维度包含的元素数目。
WIDTH:用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:
1)它能确定无序数据集的点云中点的个数.
2)它能确定有序点云数据集的宽度(一行中点的数目)。
注意:有序点云数据集,意味着点云类似于图像(或者矩阵)的结构,数据分为行和列。例如WIDTH 640,每行都有640个点。
HEIGHT:用点的数目表示点云数据集的高度。
1)它表示有序点云数据集的高度(行的总数)。
2)对于无序数据集,它被设置成1(被用来检查一个数据集是有序还是无序)
VIEWPOINT:指定数据集中点云的获取视点。VIEWPOINT可能在不同坐标系之间转换的时候应用;
POINTS:指定点云中点的总数。
DATA:指定存储点云数据的数据类型。支持两种数据类型:ASCII和二进制。
注意:文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。
警告:PCD文件的文件头部分必须以上面的顺序精确指定,且彼此之间用换行隔开。
数据存储类型:
如果以ASCII形式,每一点占据一个新行:
p_1
p_2
...
p_n
从版本1.0.1开始,用字符串"nan"表示NaN,此字符表示该点的值不存在或非法。
如果以二进制形式,这里数据是数组(向量)pcl::PointCloud.points的一份完整拷贝。存储点云数据可以用简单的ASCII形式,没点占据一行,用空格或Tab键分开,没有其他任何字符。ASCII格式允许用户打开点云文件,用sed,awk等工具来对他们进行操作。