PCL数据I/O

数据I/O

  • PCD文件
    • 内容
    • 读取
    • 写入
  • 点云拼接

PCD文件

内容

每个PCD文件都包含一个头,用于标识和声明存储在该文件中的点云数据的某些属性。PCD的头必须用ASCII编码。PCD文件中指定的每个头项和ascii点数据(见下文)都用新行(\n)分隔。

PCD头包含以下条目:

  • 版本-指定PCD文件版本

  • 字段-指定点可以具有的每个维度/字段的名称。示例:

    FIELDS x y z                                # XYZ data
    FIELDS x y z rgb                            # XYZ + colors
    FIELDS x y z normal_x normal_y normal_z     # XYZ + surface normals
    FIELDS j1 j2 j3                             # moment invariants
    ...
    
  • 大小-以字节为单位指定每个维度的大小。示例:

    • unsigned char/char has 1 byte
    • unsigned short/short has 2 bytes
    • unsigned int/int/float has 4 bytes
    • double has 8 bytes
  • 类型-将每个维度的类型指定为char。当前接受的类型有:

    • I-表示有符号类型int8(char)、int16(short)和int32(int)

    • U-表示无符号类型uint8(无符号字符)、uint16(无符号短)、uint32(无符号整数)

    • F-表示浮点类型

  • COUNT-指定每个维度有多少个元素。例如,x数据通常有1个元素,但是像VFH这样的特性描述符有308个。基本上,这是一种在每个点引入n-D直方图描述符的方法,并将它们视为一个连续的内存块。默认情况下,如果不存在计数,则所有维度的计数都设置为1。

  • 宽度-指定点云数据集的宽度(以点数为单位)。宽度有两种含义:

    • 它可以为无组织的数据集指定云中的点总数(与下面的点相等);

    • 它可以指定有组织点云数据集的宽度(行中的点总数)。

    有组织的点云数据集是给点云命名的,这些点云类似于有组织的图像(或矩阵)结构,其中数据被拆分为行和列。这种点云的例子包括来自立体摄像机或飞行时间摄像机的数据。有组织的数据集的优点是,通过知道相邻点(如像素)之间的关系,最近邻操作更有效,从而加快了计算速度,降低了PCL中某些算法的成本

  • 高度-以点数指定点云数据集的高度。高度有两层含义:

    • 它可以指定有组织的点云数据集的高度(总行数);

    • 对于无组织的数据集,它设置为1(因此用于检查数据集是否有组织)。

  • 视点-为数据集中的点指定获取视点。这可能在以后用于在不同坐标系之间构建变换,或用于辅助需要一致方向的特征(如曲面法线)。

    视点信息指定为平移(tx ty tz)+四元数(qw qx qy qz)。默认值为:

    VIEWPOINT 0 0 0 1 0 0 0
    
  • -指定云中点的总数。

  • 数据-指定存储点云数据的数据类型。支持两种数据类型:ascii和binary。

读取

#include 
#include 
#include 

  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  //从磁盘加载点云数据
  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file
  {
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
    return (-1);
  }
  //可以读取PCLPointCloud2 blob(仅在PCL 1.x中可用)。由于点云的动态特性,我们更喜欢将其读取为二进制blob,然后转换为要使用的实际表示。
  pcl::PCLPointCloud2 cloud_blob;
  pcl::io::loadPCDFile ("test_pcd.pcd", cloud_blob);
  pcl::fromPCLPointCloud2 (cloud_blob, *cloud); //* convert from pcl/PCLPointCloud2 to pcl::PointCloud

写入

#include 
#include 
#include 
  //写入磁盘
  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);

点云拼接

暂未用到

你可能感兴趣的:(PCL)