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)
- 复制点云数据(点云复制指在原数据基础上复制,非交叉部分不变)