PCD与STL格式及其内涵

PCD与STL格式及其内涵

  • PCD格式
      • PCD文件的版本
      • PCD文件头格式
      • 数据存储类型
      • 相对其他文件格式的优势:
  • STL格式
      • STL的ASCII格式
      • STL的BINARY格式

PCD格式

PCD(Point Cloud Data)格式是PCL(Point Cloud Library)的标准官方格式。

PCD文件的版本

在点云库PCL1.0版本发布之前,PCD格式有不同的修订号。这些修订号用PCD_Vx来编号(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本号。而PCL中PCD文件格式的正式发布是0.7版本(PCD_V7)。

PCD文件头格式

每一个PCD文件包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ASCII点数据都用一个新行(\n)分开,从0.7版本开始,PCD文件头包含下面的字段:

  • VERSION – 指定PCD文件版本
  • FIELDS – 指定一个点可以有的每一个维度和字段的名字。 例如:
FIELDS x y z                                   # XYZ data
FIELDS x y z rgb                       		   # XYZ + colors
FIELDS x y z normal_x normal_y normal_z         # XYZ + surface normals
FIELDS j1 j2 j3                                # moment invariants
  • SIZE – 用字节数指定每一个维度的大小。 例如:
unsigned char/char has 1 byte
unsigned short/short has 2 bytes
unsignedint/int/float has 4 bytes
double has 8 bytes
  • TYPE – 用一个字符指定每一个维度的类型。 现在被接受的类型有:
I – 表示有符号类型int8(char)、int16(short)和int32(int);
U – 表示无符号类型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F – 表示浮点类型。
  • COUNT – 指定每一个维度包含的元素数目。
    例如,x这个数据通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当做单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置成1。

  • WIDTH – 用点的数量表示点云数据集的宽度。 根据是有序点云还是无序点云,WIDTH有两层解释:

1)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
2)它能确定有序点云数据集的宽度(一行中点的数目)。

注意: 有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。

例如:

WIDTH 640       # 每行有640个点
  • HEIGHT – 用点的数目表示点云数据集的高度。 类似于WIDTH ,HEIGHT也有两层解释:
1)它表示有序点云数据集的高度(行的总数);
2)对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。

有序点云例子:

WIDTH 640       # 像图像一样的有序结构,有640行和480列,
HEIGHT 480      # 这样该数据集中共有640*480=307200个点

无序点云例子:

WIDTH 307200
HEIGHT 1        # 有307200个点的无序点云数据集
  • VIEWPOINT– 指定数据集中点云的获取视点。 VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位。

视点信息被指定为平移(tx ty tz)+四元数(qw qx qy qz)。默认值是:

VIEWPOINT 0 0 0 1 0 0 0
  • POINTS – 指定点云中点的总数。 从0.7版本开始,该字段就有点多余了,因此有可能在将来的版本中将它移除。

例子:

POINTS 307200   #点云中点的总数为307200
  • DATA – 指定存储点云数据的数据类型。 从0.7版本开始,支持两种数据类型:ascii和二进制。

注意: 文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。

警告: PCD文件的文件头部分必须以上面的顺序精确指定,也就是如下顺序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA,之间用换行隔开。

数据存储类型

在0.7版本中,.PCD文件格式用两种模式存储数据:

  • 如果以ASCII形式,每一点占据一个新行:
p_1
p_2
...
p_n

注意: 从PCL 1.0.1版本开始,用字符串“nan”表示NaN,此字符表示该点的值不存在或非法等。

  • 如果以二进制形式,这里数据是数组(向量)pcl::PointCloud.points的一份完整拷贝,在Linux系统上,我们用mmap/munmap操作来尽可能快的读写数据,存储点云数据可以用简单的ascii形式,每点占据一行,用空格键或Tab键分开,没有其他任何字符。也可以用二进制存储格式,它既简单又快速,当然这依赖于用户应用。ascii格式允许用户打开点云文件,使用例如gunplot这样的标准软件工具更改点云文件数据,或者用sed、awk等工具来对它们进行操作。

综上,PCD文件头的格式如下:

# .PCD v0.7 - Point Cloud Data file format  
VERSION 0.7 //PCD文件版本
FIELDS x y z r g b intensity timestamp //每个点包含哪些维度,xyz表示XYZ三维坐标,rgb表示颜色(可以分开表示,也可以一个浮点数表示),intensity表示激光反射强度,timestamp表示时间戳,normal_x、normal_y、normal_z表示平面法线三维坐标,j1、j2、j3表示不变矩。
SIZE 4 4 4 1 1 1 1 8 //每个维度的数据占用字节大小
TYPE F F F U U U U F //每个维度的数据类型,I表示有符号类型int8(char)、int16(short)、int32(int),U表示无符号类型uint8(unsigned char)、uint16(unsigned short)、uint32(unsigned int),F表示浮点型
COUNT 1 1 1 1 1 1 1 1 //每个维度含有多少个元素(如果未提供COUNT属性,默认值为1)
WIDTH 32 //用点的数量表示点云数据集的宽度。有两种含义:1.无序数据集的点云中点的数量 2.有序点云数据集的宽度(一行中点的数量),有序点云数据集中,点云类似图片或矩阵的结构,分为行和列,这种数据通常来自于立体摄像机(stereo camera)、时间飞行摄像机(Time Of Flight camera,使用红外线或者光脉冲来估计光线从发射到检测到的时间延迟来测量距离),知道点的相邻关系,使算法计算更高效。
HEIGHT 2172 //用点云数据集中点的数量表示点云数据集的高度。高度有如下两种含义:1.有序的点云数据集中,行的数量 2.无序点云数据集中,高度为1(可以用来判断一个数据集是有序的还是无序的)
VIEWPOINT 0 0 0 1 0 0 0 //指定数据集合中点的采集视点。可以用来后续可能的坐标转换,或者求平面法线坐标。格式是平移(tx ty tz) + 四元数(qw qx qy qz),默认是0 0 0 1 0 0 0。
POINTS 69504 //点云中点的总数(冗余字段)
DATA binary_compressed //点云数据的存储类型,0.7版本支持两种存储方式:ascii和binary。

相对其他文件格式的优势:

用PCD作为(另一种)文件格式可能被看成是没有必要的一项工作。但实际中,情况不是这样的,PCD文件格式并非白费力气地做重复工作,以前的文件结构因本身组成的原因不支持由PCL库引进n维点类型机制处理过程中的某些扩展,而PCD文件格式能够很好地补足这一点,PCD文件的适用性和速度在PCL中被充分发挥出来。PCD文件格式包括以下几个明显的优势:

  • 存储和处理有序点云数据集的能力——这一点对于实时应用,例如增强现实、机器人学等领域十分重要;
  • 二进制mmap/munmap数据类型是把数据下载和存储到磁盘上最快的方法;
  • 存储不同的数据类型(支持所有的基本类型:char,short,int,float,double),使得点云数据在存储和处理过程中适应性强并且高效,其中无效的点的通常存储为NAN类型;
  • 特征描述子的n维直方图——对于3D识别和计算机视觉应用十分重要。
  • 另一个优势是通过控制文件格式,我们能够使其最大程度上适应PCL,这样能获得PCL应用程序的最好性能,而不用把一种不同的文件格式改变成PCL的内部格式,这样的话通过转换函数会引起额外的延时。

注意: 尽管PCD(点云数据)是PCL中的内部文件格式,pcl_io库也提供在前面提到的所有其他文件格式中保存和加载数据。
参考链接:点云格式解读LAS/PCD

STL格式

关于STL、OBJ、AMF、3MF的历史角逐及演进,可以参考下面这篇文章:
关于3D打印文件格式:STL、OBJ、AMF、3MF的详解

STL文件格式(stereolithography,光固化立体造型术的缩写)是由3D SYSTEMS 公司于1988 年制定的一个接口协议,是一种为快速原型制造技术服务的三维图形文件格式。STL 文件由多个三角形面片的定义组成,三角形顶点的排列顺序遵循右手法则,每个三角形面片的定义包括三角形各个顶点的三维坐标三角形面片的法矢量

也就是说STL只能用来表达封闭的面或者体,STL有两种组织方式:一种是ASCII码格式,另一种是BINARY格式:

STL的ASCII格式

solid filenamestl 		//文件路径及文件名
facet normal x y z	    // 三角面片法向量的3个分量值
outer loop
vertex x y z			//三角面片第一个顶点的坐标
vertex x y z 	  	    //三角面片第二个顶点的坐标
vertex x y z			//三角面片第三个顶点的坐标
endloop
endfacet 				//第一个三角面片定义完毕
……
//多个三角面片
……
endsolid filenamestl	//整个文件结束

STL的BINARY格式

二进制STL文件用固定的字节数来给出三角面片的几何信息。
文件的起始80字节是文件头存储文件名,可以放入任何文字信息;
紧随着用4个字节的整数来描述实体的三角面片个数;
后面的内容就是逐个给出每个三角面片的几何信息。

每个三角面片占用固定的50字节:
它们依次是3个4字节浮点数,用来描述三角面片的法矢量;
3个4字节浮点数,用来描述第1个顶点的坐标;
3个4字节浮点数,用来描述第2个顶点的坐标;
3个4字节浮点数,用来描述第3个顶点的坐标。

每个三角面片的最后2个字节用来描述三角面片的属性信息(包括颜色属性等)暂时没有用。

一个二进制STL文件的大小为三角形面片数乘以50再加上84个字节。

你可能感兴趣的:(三维图像处理,STL,PCD,格式,含义)