常见点云文件解析学习笔记

本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。

传统2D计算机视觉学习笔记目录------->传送门
传统3D计算机视觉学习笔记目录------->传送门

为什么会有这么多的点云文件

我们在做2D视觉时,处理的就是类似一系列类似的二维数组,数组以图片的形式进行保存,处理的图片也有甚多的格式,比如png,jpg,bmp等。那我们在做3D视觉的时候,处理的主要是点云,点云就是由一些点的集合。点云在组成特点上分为两种,一种是有序点云,一种是无序点云。

  • 有序点云:一般由深度图还原的点云,有序点云按照图方阵一行一行的,从左上角到右下角排列,当然其中有一些无效点因为。有序点云按顺序排列,可以很容易的找到它的相邻点信息。有序点云在某些处理的时候还是很便利的,但是很多情况下是无法获取有序点云的。
  • 无序点云:无序点云就是其中的点的集合,点排列之间没有任何顺序,点的顺序交换后没有任何影响。是比较普遍的点云形式,有序点云也可看做无序点云来处理。
常见点云文件解析学习笔记_第1张图片
点云

在对点云这个格式有了初步的了解之后,我们来看看该怎么保存这些点云呢。

目前就文件格式而言有ASCII码和二进制两种编码形式,ASCII码可以直接阅读里面存储的内容,二进制的保存形式则不可读,但体积会更小。这两种保存都是没有进行过压缩的。

文件的内容的组成就有很多种形式了,也是本篇文章主要介绍的内容,我们来看看常见的格式:

  • *.pcd
  • *.off
  • *.xyz
  • *.ply
  • *.las
  • *.laz
  • *.obj
  • *.stl
  • *.vtk
  • *.3ds
    等……
常见点云文件解析学习笔记_第2张图片

怎么这么多啊 w(゚Д゚)w

点云文件格式详细解析

下面我对上面描述的一些常见的格式,进行详细的描述。

  • *.pcd

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

pcd作为PCL库官方指定格式,典型的为点云量身定制的格式。优点是支持n维点类型扩展机制,能够更好的发挥PCL库的点云处理性能。文件格式有文本和二进制两种格式。仅能支持点云数据,不能支持线面数据。

  • *.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相对其他格式,更加的简单,可以存储点和面,仅有文本格式。

  • *.xyz

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  

这个文件的优点是很简单,直接重新造轮子也没有问题,缺点是表意不明。

  • *.ply

文件主要组成部分
Header  (头部)
Vertex List  (顶点列表)
Face List  (面列表)
(lists of other elements) (其它元素列表)
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

PLY多边形文件格式,用于存储被描述为多边形集合的图形对象的格式,有用于轻松启动的ASCII表示形式,以及用于紧凑存储和快速保存和加载的二进制版本。它可以储存的资讯包含颜色、透明度、表面法向量、材质座标与资料可信度,并能对多边形的正反两面设定不同的属性,是一个比较通用和普遍的格式。

  • *.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颜色值)

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

obj文件的特点:

  • OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。
  • OBJ文件主要支持多边形(Polygons)模型,也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials)。
  • OBJ文件支持三个点以上的面。
  • OBJ文件支持法线和贴图坐标。

obj还有很多更复杂的内容,再次就不进行更多的解释了。

相应基础算法库对不同格式的支持

上面的这些点云文件的格式用代码实现解析也是非常容易的。但是作为一个开发者,最大的忌讳就是不要重复造轮子(练习另当别论)。所以,下面罗列了一下,当前我用的比较多的开源算法基础库对点云读取的支持。

  • PCL

PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台。缺点就是:目前库的维护好像停滞了……

支持文件读取:PLY、PCD、OBJ、VTK、IFS

  • 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

  • cgal

CGAL(Computational Geometry Algorithms Library)计算几何算法库,设计目标是,以C++库的形式,提供方便,高效,可靠的几何算法。其实现了很多处理点云以及处理网格的算法。个人感觉里面实现了很多比较新的算法,对于学习算法和测试demo还是比较好的,文档也比较全面。缺点就是代码比较难读,库的结构也比较复杂,每个算法的相干性不是很高,代码运行的效率不是很高。

支持的文件读取:里面每一种数据结构都基本上有自己的文件格式,但是大多数还是支持ply,xyz,off等。

  • Open3d

Open3D 是一个可以支持 3D 数据处理软件快速开发的开源库。Open3D 前端公开了一组用 C++ 和 Python 写成的精心挑选的数据结构和算法,后端高度优化并设置为并行。代码较整洁,而且维护程度较高。作为intel的2018才公布的开源项目,在点云、网格、rgbd数据上都有支持,虽然现在的开源的算法较少,估计日后在3D视觉领域如同opencv在2d图像一样的流行吧,毕竟PCL是学校学生维护的(基本上不维护了)。

支持的文件读取:xyz、pts、ply、pcd

总结

本文主要介绍了一些常见的点云文件的格式以及相关的3D处理开源算法库。目的主要是为了了解这些格式,加深对点云组成的理解,以及方便日后读取文件时进行查看。


重要的事情说三遍:

如果您看到我的文章对您有所帮助,那就点个赞呗 ( * ^ __ ^ * )

如果您看到我的文章对您有所帮助,那就点个赞呗( * ^ __ ^ * )

如果您看到我的文章对您有所帮助,那就点个赞呗( * ^ __ ^ * )

传统2D计算机视觉学习笔记目录------->传送门
传统3D计算机视觉学习笔记目录------->传送门

任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。博客地址:开飞机的乔巴

作者简介:开飞机的乔巴(WeChat:zhangzheng-thu),现主要从事机器人抓取视觉系统以及三维重建等3D视觉相关方面,另外对slam以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。

你可能感兴趣的:(常见点云文件解析学习笔记)