1. 为什么会有这么多的点云文件
我们在做2D视觉时,处理的就是类似一系列类似的二维数组,数组以图片的形式进行保存,处理的图片也有甚多的格式,比如png,jpg,bmp等。那我们在做3D视觉的时候,处理的主要是点云,点云就是由一些点的集合。点云在组成特点上分为两种,一种是有序点云,一种是无序点云。
有序点云: 一般由深度图还原的点云,有序点云按照图方阵一行一行的,从左上角到右下角排列,当然其中有一些无效点。因为有序点云按顺序排列,可以很容易的找到它的相邻点信息。有序点云在某些处理的时候还是很便利的,但是很多情况下是无法获取有序点云的。
无序点云: 无序点云就是其中的点的集合,点排列之间没有任何顺序,点的顺序交换后没有任何影响,是比较普遍的点云形式。有序点云也可看做无序点云来处理。
在对点云这个格式有了初步的了解之后,我们来看看该怎么保存这些点云呢。
目前就文件格式而言 有ASCII码和二进制 两种编码形式,ASCII码可以直接阅读里面存储的内容,二进制的保存形式则不可读,但体积会更小。这两种保存都是没有进行过压缩的。
文件的内容的组成就有很多种形式了,也是本篇文章主要介绍的内容,我们来看看常见的格式:
*.pcd
*.off
*.xyz
*.ply
*.obj
*.stl
*.vtk
*.3ds
2. 常见的点云文件格式解析
2.1 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。
文件格式头中的顺序不能改变,即一定是如下顺序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
pcd作为PCL库官方指定格式,典型的为点云量身定制的格式。优点是支持n维点类型扩展机制,能够更好的发挥PCL库的点云处理性能。文件格式有文本和二进制两种格式。仅能支持点云数据,不能支持线面数据。
2.2 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
OFF相对其他格式,更加的简单,可以存储点和面,仅有文本格式。
2.3 xyz格式
前面3个数字是坐标,后面3个数字是法向量(也有代表颜色信息),有多少行就代表有多少个点。
17.371559 -6.531680 -8.080792 0.242422 0.419118 0.874970 //一般前三个数带标xyz,后面三个数代表法向量,也有代表颜色信息的。
15.640106 -16.101347 -9.550241 -0.543610 -0.382877 0.746922
17.750742 -6.395478 -8.307115 0.333093 0.494766 0.802655
15.432834 -15.947010 -9.587061 -0.548083 -0.385148 0.742473
23.626318 -7.729815 -13.608750 0.081697 0.502976 0.860431
15.300377 -15.610346 -9.547507 -0.569658 -0.341132 0.747743
23.975805 -7.512131 -13.775388 0.082388 0.564137 0.821561
24.251831 -7.345085 -13.949208 0.099309 0.574142 0.812711
2.4 ply格式
PLY,多边形文件格式,表示存储描述为多边形集合的图形对象的 3D 文件格式。这种文件格式的目的是建立一种简单易用的文件类型,该文件类型足够通用,可用于各种模型。 PLY 文件格式有 ASCII 和二进制格式,用于紧凑存储、快速保存和加载。
ply //关键字
format ascii 1.0 //文件编码格式
comment author: Greg Turk // 注释
comment object: another cube //注释
element vertex 8 // 定义元素为顶点 数目为8个
property float x // 上述顶点元素中的属性 x,数据类型为float
property float y // 上述顶点元素中的属性 y,数据类型为float
property float z // 上述顶点元素中的属性 z,数据类型为float
property uchar red // 上述顶点元素中的属性 red,数据类型为uchar
property uchar green // 上述顶点元素中的属性 green,数据类型为uchar
property uchar blue // 上述顶点元素中的属性 blue,数据类型为uchar
element face 7 // 定义面元素,数目为7个
property list uchar int vertex_index // 定义面元素内的列表属性,列表开头以uchar的数值表示列表的项目数,后面接着型态为int的顶点索引值(vertex_indices),顶点索引值从0开始。
element edge 5 //定义元素为边,数目为5个
property int vertex1
property int vertex2
property uchar red
property uchar green
property uchar blue
end_header // 文件头部分结束
0 0 0 255 0 0 //顶点的开始,分别为x y z r g b
0 0 1 255 0 0
0 1 1 255 0 0
0 1 0 255 0 0
1 0 0 0 0 255
1 0 1 0 0 255
1 1 1 0 0 255
1 1 0 0 0 255
3 0 1 2 //面的开始,这是个三角行,分别有第0 ,1, 2 相连
3 0 2 3
4 7 6 5 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
0 1 255 255 255 // 边的开始,顶点分别是第0个与第一个点,颜色是255,255,255
1 2 255 255 255
2 3 255 255 255
3 0 255 255 255
2.5 obj格式
obj是一种文本文件,通常用以“#”开头的注释行作为文件头,数据部分每一行的开头关键字代表该行数据所表示的几何和模型元素,以空格做数据分隔符。
# The units used in this file are centimeters.
g default // 组名称
v -0.500000 -0.500000 0.500000 // v 代表顶点坐标
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.000000 0.000000 //"vt"代表点的贴图坐标
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vt 0.000000 2.000000
vt 1.000000 2.000000
vt 0.000000 3.000000
vt 1.000000 3.000000
vt 0.000000 4.000000
vt 1.000000 4.000000
vt 2.000000 0.000000
vt 2.000000 1.000000
vt -1.000000 0.000000
vt -1.000000 1.000000
vn 0.000000 0.000000 1.000000 //vn 代表顶点法线
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
s off //表示关闭光滑组
g pCube1 //
usemtl initialShadingGroup //表示使用的材质
f 1/1/1 2/2/2 4/4/3 3/3/4 //f 面,顶点索引/uv点索引/法线索引
f 3/3/5 4/4/6 6/6/7 5/5/8
f 5/5/9 6/6/10 8/8/11 7/7/12
f 7/7/13 8/8/14 2/10/15 1/9/16
f 2/2/17 8/11/18 6/12/19 4/4/20
f 7/13/21 1/1/22 3/3/23 5/14/24
2.6 stl格式
3D Systems公司创建的模型文件格式,用于表示三角形网格,主要应用于CAD、CAM领域。STL从功能上只能用来表示封闭面或体,有文本和二进制两种文件格式。
文本格式的STL文件的首行给出了文件路径及文件名,下面逐行给出三角面片的几何信息,每一行以1个或2个关键字开头。STL文件格式以三角面(facet)为单位组织数据,每一个三角面由7 行数据组成:facet normal 是三角面片指向实体外部的法矢量坐标,outer loop 说明随后的3行数据分别是三角面片的3个顶点坐标(vertex),3顶点沿指向实体外部的法矢量方向逆时针排列。最后一行是结束标志。
solidfilenamestl //文件路径及文件名
facet normal x yz // 三角面片法向量的3个分量值
outer loop
vertex x y z //三角面片第一个顶点的坐标
vertex x y z // 三角面片第二个顶点的坐标
vertex x y z //三角面片第三个顶点的坐标
endloop
endfacet // 第一个三角面片定义完毕
……
……
endsolid filenamestl ∥整个文件结束