点云数据pcd文件简介

SLAM学习交流可加群:248085206

三维点云数据简介

1 什么是点云数据

        点云数据是指在一个三维坐标系中的一组向量的集合。这些向量通常以X,Y,Z三维坐标的形式表示,一般主要代表一个物体的外表面几何形状,除此之外点云数据还可以附带RGB信息,即每个坐标点的颜色信息,或者是其他的信息。

2 点云数据格式——PCD文件

        在这里推荐大家都将都将点云数据保存为 *.pcd文件,因为有pcl这个开源库专门处理pcd格式的文件,它实现了点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
        下面是通过pycharm编辑器解析的.pcd文件:
点云数据pcd文件简介_第1张图片

2.1 下面介绍该文件每行具体所代表的含义:

(1).VERSION 0.7
    指定pcd文件的版本。

(2).FIELDS
    指定每个点可以具有的维度,以及每个维度所代表的含义。
    例如:FIELDS x y z r g b表示该点的位置信息(x,y,z),颜色信息(r,g,b)。

(3).SIZE
    以字节为单位指定每个数据所占用的内存。

(4).TYPE
    指定每个数据的数据类型。其中无效的点的通常存储为NAN类型。
    I:可表示int8,int16,int32。
    U:可表示uint8,unit16,uint32。
    F:表示float(上图所用的为浮点类型)。

(5).COUNT
    指定每个维度有多少元素。
    例如xyz数据通常只有一个元素。

(6).WIDTH
    指定数据点的宽度,它包含两个含义:
    1.可指定点云总个数(与POINTS相同),用于无组织的数据。
    2.可指定有组织点云数据的宽度(连续点的总数)。

(7).HEIGTH
    指定数据点的高度,它包含两个含义:
    1.可指定有组织的点云数据的高度(总行数)。
    2.对未组织的数据,它被设置为1。

(8).POINTS
    指定点云总个数。

(9).VIEWPOINT
    采集数据时的视点(由平移tx,ty,tz和四元数qw,qx,qy,qz组成)。

(10).DATA
    点云数据存储的数据类型(支持ascii和binary)。如果以ASCII形式,每一点占据一个新行。

3 总结

        所有的pcd文件前十行必须是以上的格式,并且不能改变顺序。

4 PCD文件中写入点云

write_pcd.cpp :

#include               //标准C++库中的输入输出的头文件
#include            //PCD读写类相关的头文件
#include       //PCL中支持的点类型的头文件

int
  main (int argc, char** argv)
{
  //实例化的模板类PointCloud  每一个点的类型都设置为pcl::PointXYZ
/*************************************************
 点PointXYZ类型对应的数据结构
    Structure PointXYZ{
     float x;
     float y;
     float z;
    };
**************************************************/
  pcl::PointCloud cloud; //创建一个存储点云的容器,容器中每个点的类型是pcl::PointXYZ。

  // 并设置点云容器适当的参数(width height is_dense)
  cloud.width    = 5;
  cloud.height   = 1;
  cloud.is_dense = false;  //不是稠密型的
  cloud.points.resize (cloud.width * cloud.height);  //点云总数大小
   //用随机数的值填充PointCloud点云对象 
  for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
  }
  //把PointCloud对象数据存储在 test_pcd.pcd文件中,并以ascii码的形式。
  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud); 
  
//打印输出存储的点云数据
  std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;

  for (size_t i = 0; i < cloud.points.size (); ++i)
    std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;

  return (0);
}

5 从PCD文件读取点云数据

write.cpp:

#include               //标准C++库中的输入输出的头文件
#include        //PCD读写类相关的头文件
#include      //PCL中支持的点类型的头文件

int
main (int argc, char** argv)
{ 
   //创建一个PointCloud    boost共享指针并进行实例化
  pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
  
  //打开点云文件
  if (pcl::io::loadPCDFile ("test_pcd.pcd", *cloud) == -1) 
  {
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
    return (-1);
  }
//默认就是而二进制块读取转换为模块化的PointCLoud格式里pcl::PointXYZ作为点类型  然后打印出来
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;
  for (size_t i = 0; i < cloud->points.size (); ++i)
    std::cout << "    " << cloud->points[i].x
              << " "    << cloud->points[i].y
              << " "    << cloud->points[i].z << std::endl;

  return (0);
}

你可能感兴趣的:(SSlam)