1 点云
在做3D视觉的时候,处理的主要是点云,点云就是由一些点的集合。点云在组成特点上分为两种,一种是有序点云,一种是无序点云。
- 有序点云:一般由深度图还原的点云,有序点云按照图方阵一行一行的,从左上角到右下角排列,当然其中有一些无效点因为。有序点云按顺序排列,可以很容易的找到它的相邻点信息。有序点云在某些处理的时候还是很便利的,但是很多情况下是无法获取有序点云的。
- 无序点云:无序点云就是其中的点的集合,点排列之间没有任何顺序,点的顺序交换后没有任何影响。是比较普遍的点云形式,有序点云也可看做无序点云来处理。
目前就文件格式而言有ASCII码和二进制两种编码形式,ASCII码可以直接阅读里面存储的内容,二进制的保存形式则不可读,但体积会更小。这两种保存都是没有进行过压缩的。
文件的内容的组成就有很多种形式了,常见的格式:
*.pcd
*.off
*.xyz
*.ply
*.las
*.laz
*.obj
*.stl
*.vtk
*.3ds
...
1.1 pcd文件
pcd作为PCL库官方指定格式,典型的为点云量身定制的格式。优点是支持n维点类型扩展机制,能够更好的发挥PCL库的点云处理性能。文件格式有文本和二进制两种格式。仅能支持点云数据,不能支持线面数据。
# .PCD v.7 - Point Cloud Data file format
VERSION .7 //指定PCD文件版本
FIELDS x y z rgb //指定一个点可以有的每一个维度和字段的名字
SIZE 4 4 4 4 //用字节数指定每一个维度的大小
TYPE F F F F //用一个字符指定每一个维度的类型
COUNT 1 1 1 1 //指定每一个维度包含的元素数目
WIDTH 213 //用点的数量表示点云数据集的宽度
HEIGHT 1 //用点的数量表示点云数据集的高度,无序点云会是1
VIEWPOINT 0 0 0 1 0 0 0 //指定数据集中点云的获取视点。
POINTS 213 //点云中点的数目
DATA ascii //数据保存的编码方式
0.93773 0.33763 0 4.2108e+06 //每个点的数据,根据FIELDS,可知按顺序分别是x,y,z rgb
0.90805 0.35641 0 4.2108e+06
1.2 off文件
OFF格式文件头有两行:第一行以off关键字开头,第二行表示顶点数、面数、边数。主体分为顶点坐标(顶点列表)和面的顶点索引(面列表)两个部分,其中每个面的顶点数可以指定,用第一个数表示。OFF相对其他格式,更加的简单,可以存储点和面,仅有文本格式。
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
1.3 xyz文件
xyz以行数来表明点数,没有头进行解释。
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
1.4 ply文件
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
1.5 las文件
LiDAR数据的工业标准格式,旨在提供一种开放的格式标准,允许不同的硬件和软件提供商输出可互操作的统一格式。是一种二进制文件格式。las文件格式除了基本的三维坐标之外,保留了原始扫描的数据采集信息。
一个符合LAS标准的LIDAR文件分为三个部分:公用文件头块、变量长度记录和点数据记录。
LAS文件包含以下信息:
- C--class(所属类)
- XYZ -三维坐标
- F一flight(航线号)
- T一time(GPS时间)
- I一intensity(回波强度)
- R一return(第几次回波)
- N一number of return(回波次数)
- A一scan angle(扫描角)
- RGB一red green blue(RGB颜色值)
1.6 obj文件
obj是一种文本文件,通常用以“#”开头的注释行作为文件头,数据部分每一行的开头关键字代表该行数据所表示的几何和模型元素,以空格做数据分隔符。
- OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。
- OBJ文件主要支持多边形(Polygons)模型,也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials)。
- 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
...
vt 0.000000 0.000000 //"vt"代表点的贴图坐标
vt 1.000000 0.000000
vt 0.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
...
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
1.7 mtl文件
.mtl文件(Material Library File)是材质库文件,描述的是物体的材质信息,ASCII存储,任何文本编辑器可以将其打开和编辑。一个.mtl文件可以包含一个或多个材质定义,对于每个材质都有其颜色,纹理和反射贴图的描述,应用于物体的表面和顶点。
# 定义一个名为 'xxx'的材质
newmtl xxx
# 材质的环境光(ambient color)
Ka 0 0 0
# 散射光(diffuse color)用Kd
Kd 0.784314 0.784314 0.784314
# 镜面光(specular color)用Ks
Ks 0 0 0
# 折射值 可在0.001到10之间进行取值。若取值为1.0,光在通过物体的时候不发生弯曲。玻璃的折射率为1.5。
Ni 1
# 反射指数 定义了反射高光度。该值越高则高光越密集,一般取值范围在0~1000。
Ns 400
# 滤光透射率
Tf 1 1 1
# 渐隐指数描述 参数factor表示物体融入背景的数量,取值范围为0.0~1.0,取值为1.0表示完全不透明,取值为0.0时表示完全透明。
d 1
# 为漫反射指定颜色纹理文件
map_Kd test_vt.bmp
2 Mesh
3 体素
4 算法库支持
4.1 PCL
PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台。缺点就是:目前库的维护好像停滞了……
支持文件读取:PLY、PCD、OBJ、VTK、IFS
4.2 vcglib
VCG Libary(Visulization and Computer Graphics Libary)是专门为处理三角网格而设计的,库很大,且提供了许多先进的处理网格的功能,以及比较少的点云处理功能。用的比较的轻型点云处理软件meshlab就是以vcglib为底层实现的。这个库的缺点就是文档太少了(基本等于没有),对初学者不友好。
支持文件读取: PLY, STL, OFF, OBJ, 3DS, COLLADA, PTX, V3D, PTS, APTS, XYZ, GTS, TRI, ASC, X3D, X3DV, VRML, ALN
支持文件保存: PLY, STL, OFF, OBJ, 3DS, COLLADA, VRML, DXF, GTS, U3D, IDTF, X3D
4.3 cgal
CGAL(Computational Geometry Algorithms Library)计算几何算法库,设计目标是,以C++库的形式,提供方便,高效,可靠的几何算法。其实现了很多处理点云以及处理网格的算法。个人感觉里面实现了很多比较新的算法,对于学习算法和测试demo还是比较好的,文档也比较全面。缺点就是代码比较难读,库的结构也比较复杂,每个算法的相干性不是很高,代码运行的效率不是很高。
支持的文件读取:里面每一种数据结构都基本上有自己的文件格式,但是大多数还是支持ply,xyz,off等。
4.4 Open3d
Open3D 是一个可以支持 3D 数据处理软件快速开发的开源库。Open3D 前端公开了一组用 C++ 和 Python 写成的精心挑选的数据结构和算法,后端高度优化并设置为并行。代码较整洁,而且维护程度较高。作为intel的2018才公布的开源项目,在点云、网格、rgbd数据上都有支持,虽然现在的开源的算法较少,估计日后在3D视觉领域如同opencv在2d图像一样的流行吧,毕竟PCL是学校学生维护的(基本上不维护了)。
支持的文件读取:xyz、pts、ply、pcd
5 ShapeNet数据集
ShapeNet包含两个子集:
- ShapeNetCore
55个类别,51300个3D模型 - ShapeNetSem
270个类别,12000个3D模型
5.1 ShapeNetCore
- 文件组织结构
- <synsetId>
- <modelId>
- model.obj : (3D Rotatable version of the image)
- model.mtl : Materials file for OBJ; Includes the name of texture files and material properties.
- images
- jpg, png: Textures for the 3D model
- <synsetId>.csv : (Metadata associated with the model of the synset)
- ...
- 57个zip文件。每一个zip文件都以synset命名,是一组3D模型的集合。
- 每一个模型都有一个以source id命名的文件夹,其中包含了该模型的OBJ、MTL和texture image文件。
- 57个csv文件。同时每个synset集合都有一个相应的csv文件,包含了这组模型的一些元数据。
- OBJ文件是经过预对齐的,+Y为向上的方向,+X为向前的方向,并且每个模型都是归一化的,可以包含在一个以坐标原点为中心的单位立方体内。因此,X-Y平面成为多数类别的对称平面。
get-metadata.sh
文件。可以重新下载前面所提到的csv文件(元数据)的脚本。taxonomy.json
文件。用JSON格式记录了ShapeNetCore数据集中每个synset的synsetId, name, children和numInstances.jq
文件是一个处理JSON文件的库。
5.2 ShapeNetSem
参考资料
https://www.jianshu.com/p/b52e152d44a9
https://www.jianshu.com/p/ffedad5e8e30