点云数据文件常用格式及PCL中点云数据类型

  • Post author:
  • Post category:其他



一、 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

其它元素请参考资料:


3D中的OBJ文件格式详解 – 勇敢的公爵 – 博客园


*.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)部分。


pcap文件格式_Joyce-CSDN博客_pcap格式


*.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



版权声明:本文为qq_60143666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。