zoukankan      html  css  js  c++  java
  • PCL——(3)PCD(点云数据)文件格式简介

    @

    一、为什么用一种新的文件格式?

    PCD文件格式并非白费力气地做重复工作,现有的文件结构因本身组成的原因不支持由PCL库引进n维点类型机制处理过程中的某些扩展,而PCD文件格式能够很好地补足这一点。PCD不是第一个支持3D点云数据的文件类型,尤其是计算机图形学和计算几何学领域,已经创建了很多格式来描述任意多边形和激光扫描仪获取的点云。包括下面几种格式:

    PLY 是一种多边形文件格式,由Stanford大学的Turk等人设计开发;
    STL 是3D Systems公司创建的模型文件格式,主要应用于CAD、CAM领域;
    OBJ 是从几何学上定义的文件格式,首先由Wavefront Technologies开发;
    X3D 是符合ISO标准的基于XML的文件格式,表示3D计算机图形数据;
    / 其他许多种格式。

    以上所有的文件格式都有缺点。这是很自然的,因为它们是在不同时间为了不同的使用目的所创建的,那时今天的新的传感器技术和算法都还没有发明出来。

    二、文件格式

    每一个PCD文件包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ascii点数据都用一个新行( )分开了,从0.7版本开始,PCD文件头包含下面的字段:

    2.1·VERSION

    指定PCD文件版本

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

    2.3·SIZE

    用字节数指定每一个维度的大小。例如:

    unsigned char/char has 1 byte
    unsigned short/short has 2 bytes
    unsignedint/int/float has 4 bytes
    double has 8 bytes
    

    2.4·TYPE

    用一个字符指定每一个维度的类型。现在被接受的类型有:

    I –表示有符号类型int8(char)、int16(short)和int32(int);
    U – 表示无符号类型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
    F –表示浮点类型。
    

    2.5·COUNT

    指定每一个维度包含的元素数目。例如:
    x这个数据通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当做单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置成1。

    2.6·WIDTH

    用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:

    • 1)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
    • 2)它能确定有序点云数据集的宽度(一行中点的数目)。
      注意:有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。
    例如:WIDTH 640       # 每行有640个点
    

    2.7·HEIGHT

    用点的数目表示点云数据集的高度。类似于WIDTH ,HEIGHT也有两层解释:

    • 1)它表示有序点云数据集的高度(行的总数);
    • 2)对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。
    有序点云例子:
    WIDTH 640       # 像图像一样的有序结构,有640行和480列,
    HEIGHT 480      # 这样该数据集中共有640*480=307200个点
    
    无序点云例子:
    WIDTH 307200
    HEIGHT 1        # 有307200个点的无序点云数据集
    

    2.8·VIEWPOINT

    指定数据集中点云的获取视点(原点)。

    VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位.
    视点信息被指定为平移(txtytz)+四元数(qwqxqyqz)。默认值是:VIEWPOINT 0 0 0 1 0 0 0

    2.9·POINTS

    指定点云中点的总数。从0.7版本开始,该字段就有点多余了,因此有可能在将来的版本中将它移除。

    例子:
    POINTS 307200   #点云中点的总数为307200
    

    2.10·DATA

    指定存储点云数据的数据类型。从0.7版本开始,支持两种数据类型:ascii和二进制。

    • 注意:文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。

    • 警告:PCD文件的文件头部分必须以上面的顺序精确指定,也就是如下顺序:

    VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
    

    之间用换行隔开。
    数据存储类型

    在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等工具来对它们进行操作。

    2.11 实例

    下面贴出了PCD文件的一个片段。看看它的组成!

    # .PCD v.7 - Point Cloud Data file format
    
    VERSION .7
    
    FIELDS x y z rgb
    
    SIZE 4 4 4 4
    
    TYPE F FFF
    
    COUNT 1 1 1 1
    
    WIDTH 213
    
    HEIGHT 1
    
    VIEWPOINT 0 0 0 1 0 0 0
    
    POINTS 213
    
    DATA ascii
    
    0.93773 0.33763 0 4.2108e+06
    
    0.90805 0.35641 0 4.2108e+06
    

    三、相对其他文件格式的优势

    用PCD作为(另一种)文件格式可能被看成是没有必要的一项工作。但实际中,情况不是这样的,因为上面提到的文件格式无一能提高PCD文件的适用性和速度。PCD文件格式包括以下几个明显的优势:

    • 1)存储和处理有序点云数据集的能力——这一点对于实时应用,例如增强现实、机器人学等领域十分重要;

    • 2)二进制mmap/munmap数据类型是把数据下载和存储到磁盘上最快的方法;

    • 3)存储不同的数据类型(支持所有的基本类型:char,short,int,float,double)——使得点云数据在存储和处理过程中适应性强并且高效,其中无效的点的通常存储为NAN类型;

    • 4)特征描述子的n维直方图——对于3D识别和计算机视觉应用十分重要。

    • 5)另一个优势是通过控制文件格式,我们能够使其最大程度上适应PCL,这样能获得PCL应用程序的最好性能,而不用把一种不同的文件格式改变成PCL的内部格式,这样的话通过转换函数会引起额外的延时。

    打赏

    码字不易,如果对您有帮助,就打赏一下吧O(∩_∩)O

    支付宝

    微信

  • 相关阅读:
    4-11 EurekaClient集成演示
    4-10 原始版服务调用演示
    4-9 Consumer内容准备
    4-8 Provider内容准备
    Swift:用UICollectionView整一个瀑布流
    Swift: 用Alamofire做http请求,用ObjectMapper解析JSON
    Swift: 用UserDefaults保存复杂对象
    BAT的真的适合创业团队吗?
    为什么要用GCD-Swift2.x
    Objective-C的泛型
  • 原文地址:https://www.cnblogs.com/long5683/p/13274820.html
Copyright © 2011-2022 走看看