PCL教程指南-基础概要

此系列文章旨在小白对PCL入门,以个人在PCL官方文档所学,加以理解通过中文解读代码的意图

1.前言

  • PCL 全程Point Cloud Libirary 中文翻译为点云库;它是在C++基础上开发的点云处理包,包含点云数据结构,点云输入输出,点云滤波,点云特征,点云配准,点云识别,点云分割,三维重建,可视化等模块。极大简化了相关人员开发与实验过程。
  • PCL学习之前,你需要了解C++语法基础,否则PCL代码将成为学习的第一道门槛

2.PCD数据格式

  • PCD点云格式是PCL独有的点云组织结构,
  • 对于有序点云 cloud.width代表宽度方向上点个数 cloud.height代表高度方向上点个数
  • 而对于无序点云 cloud.width代表点总数 cloud.height此时为1

PCD格式示例:

# .PCD v.7 - Point Cloud Data file format
VERSION .7  //版本号
FIELDS x y z rgb  //字段  其中rgb是一个数值,由r g b得到rgb(float): rgb = ((int)r << 16 | (int)g << 8 | (int)b);  式中的“<<”为左移符号;由rgb得到r g b(int):int r = (rgb >> 16) & 0x0000ff;  int g = (rgb >> 8) & 0x0000ff;  int b = (rgb) & 0x0000ff; 
SIZE 4 4 4 4  //每个字段的字节大小
TYPE F F F F  //每个字段类型 F指Float
COUNT 1 1 1 1 //每个字段所含元素 一般无此属性均设置为1
WIDTH 213  //无序点云总数
HEIGHT 1	//无序点云
VIEWPOINT 0 0 0 1 0 0 0 //视点 X=0 Y=0 Z=0; 1 0 0 0 代表旋转四元数 
POINTS 213  //总数
DATA ascii  //编码格式
0.93773 0.33763 0 4.2108e+06  //X Y Z rgb
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06

3.PCL数据结构

  • 点云对象一般定义形式为
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  • 其中pcl::PointCloud 意思为pcl命名空间下的PointCloud类,< pcl::PointXYZ >则为XYZ数据结构泛型, Ptr指指针 之后则为对象名及实例化;
  • 即创建一个XYZ结构的点云共享指针(共享指针为C++新特性,PCL封装好了,无需人工释放
  • pcl::PointXYZ 则为最为常用的点云数据结构,包含XYZ坐标。
  • pcl提供了大量数据结构包括但不限于 < pcl::PointXYZRGB > < pcl::PointNormal > < Normal >等
  • 数据结构内部采用C++ union和struct结构,具体作用自查。简单理解就是共享内存和封装结构

4.PCL点云预处理所需的常用函数

  • pcl::isFinite<pcl::Normal>((*normals)[i])
  • 判断是否有定义
  • cloud.is_dense
  • 点云中是否有无效数据
  • pcl::removeNaNFromPointCloud(*cloud, *new_cloud, NaNIndices);
  • 移除点云中NaN数据
  • cloud1.swap(cloud2)
  • 交换点云数据
  • pcl::copyPointCloud(cloud1,cloud2,indexs)
  • 复制点云数据(点云复制指在原数据基础上复制,非交叉部分不变)