点云库PCL从入门到精通
上QQ阅读APP看书,第一时间看更新

1.4 PCL的结构与核心内容

对于3D点云处理来说,PCL完全是一个模块化的现代C++模板库,如图1-2所示。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。

图1-2 PCL架构图

PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows、MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。

从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤、特征估计、表面重建、模型拟合和分割、定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。在PCL中一个处理管道的基本接口程序如下。

• 创建处理对象(例如过滤、特征估计、分割等)。

• 使用setInputCloud通过输入点云数据,处理模块。

• 设置算法相关参数。

• 调用计算(或过滤、分割等)得到输出。

为了进一步简化和开发,PCL被分成一系列较小的代码库,使其模块化,以便能够单独编译使用,提高可配置性,特别适用于嵌入式处理中。PCL中常用代码库介绍如下。

• libpcl filters:如采样、去除离群点、特征提取、拟合估计等数据实现过滤器。

• libpcl features:实现多种三维特征,如曲面法线、曲率、边界点估计、矩不变量、主曲率,PFH和FPFH特征,旋转图像、积分图像,NARF描述子,RIFT,相对标准偏差,数据强度的筛选等等。

• libpcl I/O:实现数据的输入和输出操作,例如点云数据文件(PCD)的读写。

• libpcl segmentation:实现聚类提取,如通过采样一致性方法对一系列参数模型(如平面、柱面、球面、直线等)进行模型拟合点云分割提取,提取多边形棱镜内部点云等。

• libpcl surface:实现表面重建技术,如网格重建、凸包重建、移动最小二乘法平滑等。

• libpcl register:实现点云配准方法,如ICP等。

• libpcl keypoints:实现不同的关键点的提取方法,这可以用来作为预处理步骤,决定在哪儿提取特征描述符。

• libpcl range:实现支持不同点云数据集生成的范围图像。

为了保证PCL中操作的正确性,上述提到的库中的方法和类包含了单元测试。这套单元测试通常都是由专门的构建按需求编译和验证的。当某一部分测试失败时,这些特定部分的各自作者就会立即被告知。这彻底地保证了代码测试过程出现的任何变故,以及新功能或修改都不会破坏PCL中已经存在的代码。