一、 PCL中点云数据类型
由于采集设备不同时输入点云信息不同,比如有的只有法向量,有的伴有颜色,强度等信息。必要时,使用者需要自己定义自己的类型。不过先看看PCL库中定义的点云类型是否已经涵盖。
1
)PointXYZ
pcl::PointCloud<pcl::PointXYZ>
成员变量: float x, y, z;
最常见的一个点数据类型,因为它只包含三维xyz坐标信息, 值得注意的是它多加了一个浮点数来满足内存对齐
//访问xyz方式一
float x = cloud.points[i].data[0];
float y = cloud.points[i].data[1];
float z = cloud.points[i].data[2];
//访问xyz方式二
float x = cloud.points[i].x;
float y = cloud.points[i].y;
float z = cloud.points[i].z;
2
)PointXYZI
pcl::PointCloud<pcl::PointXYZI>
成员变量: float x, y, z, intensity; 表示XYZ信息加上强度信息的类型。
3
)PointXYZRGBA
pcl::PointCloud<pcl::PointXYZRGBA>
成员变量: float x, y, z; uint32_t rgba;
表示XYZ信息加上RGBA信息,RGBA用32bit的int型存储的。
4
)PointXYZRGB
pcl::PointCloud<pcl::PointXYZRGB>
成员变量: float x, y, z, rgb; 表示XYZ信息加上RGB信息,RGB存储为一个float。
5
)PointXY
成员变量: float x, y;
6
)InterestPoint
成员变量: float x, y, z, strength;
除了strength表示关键点的强度的测量值,其它的和PointXYZI类似
7
)Normal
成员变量: float normal_x,normal_y,normal_z, curvature;
Normal结构体:表示给定点所在样本曲面上的法线方向,以及对应曲率的测量值,用第四个元素来占位,兼容SSE和高效计算。用户访问法向量的第一个坐标,可以通过points[i].data_n[0]或者points[i].normal[0]或者points[i].normal_x,但曲率不能被存储在同一个结构体中,因为它会被普通的数据操作覆盖掉。
Eg:PointXYZRGBNormal – float x, y, z, rgb, normal[3], curvature; PointXYZRGBNormal存储XYZ数据和RGB颜色的point结构体,并且包括曲面法线和曲率。
8
)PointNormal
成员变量: float x, y, z,normal_x,normal_y,normal_z, curvature
9
)PointXYZRGBNormal
成员变量:float x, y, z, rgb, normal_x,normal_y,normal_z, curvature;
10
)PointXYZINormal
成员变量: float x, y, z, intensity, normal_x,normal_y,normal_z, curvature;
11
)PointWithRange
成员变量:float x, y, z (union with float point[4]), range;
range包含从所获得的视点到采样点的距离测量值之外,其它与PointXYZI类似
12
)PointWithViewpoint
成员变量:float x, y, z, vp_x, vp_y, vp_z; p_x、vp_y、vp_z以三维点表示所获得的视点
13
)MomentInvariants
成员变量:float j1, j2, j3; MomentInvariants是一个包含采样曲面上面片的三个不变矩的point类型,描述面片上质量的分布情况
14
)PrincipalRadiiRSD
是一个包含曲面块上两个RSD半径的point类型,查看RSDEstimation以获得更多信息
点云的数据格式:一般的点云形状格式为[N, M],其中N是点的个数,M可以类比成图像中的通道数,如果点云只有x,y,z三个信息,那么M=3。
二、常见点云存储文件格式简介
*.las
LiDAR数据的工业标准格式,旨在提供一种开放的格式标准,允许不同的硬件和软件提供商输出可互操作的统一格式。是一种二进制文件格式。
一个符合LAS标准的LIDAR文件分为三个部分:公用文件头块(PUBLICHEADERBLOCK)、变量长度记(VARIABLELENGTHRECORDS)和点数据记录(POINTDATARECORD)。
LAS文件包含以下信息:
C–class(所属类)
F一flight(航线号)
T一time(GPS时间)
I一intensity(回波强度)
R一return(第几次回波)
N一number of return(回波次数)
A一scan angle(扫描角)
RGB一red green blue(RGB颜色值)
示例:
可以看出,las文件格式除了基本的三维坐标之外,保留了原始扫描的数据采集信息。LAS格式定义中用到的数据类型遵循1999年ANSI(AmericanNationalStandardsInstitute,美国国家标准化协会)C语言标准。
*.obj
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。
另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件的读取。3D软件模型之间的互导是一件很常见的事情,不幸的是,目前的3D软件模型导出功能都不那么完美,经常会出现缺面少线的情况,有时还会遇到导出的模型根本打不开的情况。
OBJ文件是一种文本文件格式,比起二进制文件为主、连每个块的用途也得试探的3DS,文本文件为主的OBJ对我们更友好。与3DS文件的树状[块结构]不同,OBJ文件只是很单纯的字典状结构,没有块ID来表征名字而是简单地用易懂的表意字符来表示。总之看上去是赏心悦目的样子,而苦处也就只有实际写导入代码的时候才知道了。OBJ文件优化了存储但劣化了读写。
OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。通常用以“#”开头的注释行作为文件头。空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。
注意连接符(\)后面不能出现空格或tab格,否则将导致文件出错。
对于点云数据来说,其中最基本的两个关键字:
- v 几何体顶点 (Geometric vertices)
- f 面 (Face)
示例:
一个四边形的数据表示:
v -0.58 0.84 0
v 2.68 1.17 0
v 2.84 -2.03 0
v -1.92 -2.89 0
f 1 2 3 4
其它元素请参考资料:
*.off
1)相较于 OBJ 文件格式,OFF 文件的存储信息格式要更为简单一些。off文件为ASCII文件,以OFF关键字开头。
2)在文件的开头注明顶点、面片和边的总数。
3)文件内部只包含顶点和面片的信息,前半部分是顶点坐标,每一行都是由面片的三个顶点的坐标值组成,
4)顶点以x,y,z坐标列出,每个顶点占一行。
5)不同于 OBJ 文件,OFF 文件的后半部分是面片信息,
6)OFF 文件的面片信息的表示很简单,如 3 a b c,3 在 OFF 文件中相当于OBJ文件中面片的标志 f,a,b,c分别表示组成一个面片的三个顶点的索引号。在顶点列表之后是面列表,每个面占一行。对于每个边,首先指定其包含的顶点数,随后是这个面所包含的各顶点在前面顶点列表中的索引。
7)OFF 文件中边的数量总是忽略不计的,表示为 0。因为 OFF 文件的格式简单,很多在做三维模型数据输出的时候,采用 OFF 文件的格式。
OFF文件格式:
OFF
顶点数 面数 边数
x y z
x y z
…
n个顶点 顶点1的索引 顶点2的索引 … 顶点n的索引
…
示例:(一个立方体)
OFF 8 6 0
-0.500000 -0.500000 0.500000
0.500000 -0.500000 0.500000
-0.500000 0.500000 0.500000
0.500000 0.500000 0.500000
-0.500000 0.500000 -0.500000
0.500000 0.500000 -0.500000
-0.500000 -0.500000 -0.500000
0.500000 -0.500000 -0.500000
4 0 1 3 2
4 2 3 5 4
4 4 5 7 6
4 6 7 1 0
4 1 7 5 3
4 6 0 2 4
*.pcap
一种通用的数据流格式,现在流行的Velodyne公司出品的激光雷达默认采集数据文件格式。它是一种二进制文件。
数据构成结构如下:
整体一个全局头部(GlobalHeader),然后分成若干个包(Packet),每个包又包含头部(Header)和数据(Data)部分。
*.pcd
PCL库官方指定格式,典型的为点云量身定制的格式。下文将详细介绍。
*.ply
一种由斯坦福大学的Turk等人设计开发的多边形文件格式,因而也被成为斯坦福三角格式。文件格式有文本和二进制两种格式。
典型的PLY对象定义仅仅是顶点的(x,y,z)三元组列表和由顶点列表中的索引描述的面的列表。
文件结构如下:
· Header (头部)
· Vertex List (顶点列表)
· Face List (面列表)
· (lists of other elements) (其它元素列表)
示例:
ply
format ascii1.0 { ascii/binary, formatversion number }
comment made byGreg Turk { comments keyword specified,like all lines }
comment thisfile is a cube
element vertex8 { define “vertex”element, 8 of them in file }
property floatx { vertex contains float”x” coordinate }
property floaty { y coordinate is also avertex property }
property floatz { z coordinate, too }
element face6 { there are 6″face” elements in the file }
property listuchar int vertex_index { “vertex_indices” is a list of ints }
end_header { delimits the end of theheader }
0 0 0 { start of vertex list }
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3 { start of face list }
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
MatLab也可以通过pcread函数直接载入该格式。
参考资料:
http://paulbourke.net/dataformats/ply/
PLY文件格式_拉风小宇的博客-CSDN博客_ply文件格式
*.pts
被称之为最简便的点云格式,属于文本格式。只包含点坐标信息,按X Y Z顺序存储,数字之间用空格间隔。
示例:
0.780933-45.9836 -2.47675
4.75189 -38.1508 -4.34072
7.16471 -35.9699 -3.60734
9.12254 -46.1688 -8.60547
15.4418 -46.1823 -9.14635
2.83145 -52.2864 -7.27532
0.160988 -53.076 -5.00516
*.xyz
一种文本格式,前面3个数字表示点坐标,后面3个数字是点的法向量,数字间以空格分隔。
示例:
0.031822 0.0158355 -0.047992 0.000403-0.0620185 -0.005498
-0.002863 -0.0600555 -0.009567 -0.001945 -0.0412555 -0.001349
-0.001867 -0.0423475 -0.0019 0.002323 -0.0617885 -0.00364
三、PCD格式详解
1、为什么用一种新的文件格式?
PCD文件格式并非白费力气地做重复工作,现有的文件结构因本身组成的原因不支持由PCL库引进n维点类型机制处理过程中的某些扩展,而PCD文件格式能够很好地补足这一点。PCD不是第一个支持3D点云数据的文件类型,尤其是计算机图形学和计算几何学领域,已经创建了很多格式来描述任意多边形和激光扫描仪获取的点云。包括下面几种格式:
1)PLY:是一种多边形文件格式,由Stanford大学的Turk等人设计开发;
2)STL是3D Systems公司创建的模型文件格式,主要应用于CAD、CAM领域;
3)OBJ是从几何学上定义的文件格式,首先由Wavefront Technologies开发;
4)X3D是符合ISO标准的基于XML的文件格式,表示3D计算机图形数据;
5)其他许多种格式。
以上所有的文件格式都有缺点,这是很自然的,因为它们是在不同时间为了不同的使用目的所创建的,那时今天的新的传感器技术和算法都还没有发明出来。对于其缺点读者可自行了解。
2、PCD版本
在点云库(PCL)1.0版本发布之前,PCD文件格式有不同的修订号。这些修订号用PCD_Vx来编号(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本号。然而PCL中PCD文件格式的正式发布是0.7版本(PCD_V7)。
3、文件头格式
每一个PCD文件包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ascii点数据都用一个新行(\n)分开了,从0.7版本开始,PCD文件头包含下面的字段:
1)VERSION –指定PCD文件版本,目前PCL中为0.7版本
2)FIELDS –指定一个点可以有的每一个维度和字段的名字。
例如:
FIELDS x y z # XYZ data
FIELDS x y z rgb # XYZ + colors
FIELDS x y z normal_xnormal_y normal_z # XYZ + surface normals
FIELDS j1 j2 j3 # moment invariants
…
3)SIZE –用字节数指定每一个维度的大小。
例如:
unsigned char
/
char
has 1 byte
unsigned short
/
short
has 2 bytes
unsignedint
/
int
/
float
has 4 bytes
double
has 8 bytes
4)TYPE –用一个字符指定每一个维度的类型。
现在被接受的类型有:
I
–表示有符号类型int8(char)、int16(short)和int32(int);
U
– 表示无符号类型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F
–表示浮点类型。
5)COUNT –指定每一个维度包含的元素数目。例如,x这个数据通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当作单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置成1。
5)WIDTH –用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:
(1)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
(2)它能确定有序点云数据集的宽度(一行中点的数目)。
注意:有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。
例如:
WIDTH 640 # 每行有640个点
6)HEIGHT –用点的数目表示点云数据集的高度。
类似于WIDTH ,HEIGHT也有两层解释:
(1)它表示有序点云数据集的高度(行的总数);
(2)对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。
有序点云例子:
WIDTH 640 # 像图像一样的有序结构,有640行和480列,
HEIGHT 480 # 这样该数据集中共有640*480=307200个点
无序点云例子:
WIDTH 307200
HEIGHT 1 # 有307200个点的无序点云数据集
7)VIEWPOINT–指定数据集中点云的获取视点。VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位,
视点信息被指定为平移(txtytz)+四元数(qwqxqyqz)。默认值是:VIEWPOINT 0 0 0 1 0 0 0
8)POINTS–指定点云中点的总数。从0.7版本开始,该字段就有点多余了,因此有可能在将来的版本中将它移除。
例子:
POINTS 307200 #点云中点的总数为307200
9)DATA –指定存储点云数据的数据类型。从0.7版本开始,支持两种数据类型:ascii和二进制。
注意:文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。
警告:PCD文件的文件头部分必须以上面的顺序精确指定,也就是如下顺序:
VERSION
、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
之间用换行隔开。
4、数据存储类型
在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等工具来对它们进行操作。
5、相对其他文件格式的优势
用PCD作为(另一种)文件格式可能被看成是没有必要的一项工作。但实际中,情况不是这样的,因为上面提到的文件格式无一能提高PCD文件的适用性和速度。PCD文件格式包括以下几个明显的优势:
1)存储和处理有序点云数据集的能力——这一点对于实时应用,例如增强现实、机器人学等领域十分重要;
2)二进制mmap/munmap数据类型是把数据下载和存储到磁盘上最快的方法;
3)可以存储不同的数据类型(支持所有的基本类型:char,short,int,float,double)——使得点云数据在存储和处理过程中适应性强并且高效,其中无效的点的通常存储为NAN类型;
4)特征描述子的n维直方图——对于3D识别和计算机视觉应用十分重要。
5)另一个优势是通过控制文件格式,我们能够使其最大程度上适应PCL,这样能获得PCL应用程序的最好性能,而不用把一种不同的文件格式改变成PCL的内部格式,这样的话通过转换函数会引起额外的延时。
注意:尽管PCD(点云数据)是PCL中的内部文件格式,pcl_io库也提供在前面提到的所有其他文件格式中保存和加载数据。
参考:
https://cloud.tencent.com/developer/article/1475778