[PCL] 点云库模块综述

PCL是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、MacOSX、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用  。

对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN(Fast Library for Approximate Nearest Neighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要。    

PCL包括多个子模块库。最重要的PCL模块库有如下:过滤器Filters、特征Features、关键点Keypoints、配准Registration、Kd树Kd-tree、八叉树Octree、切割Segmentation、连接Sample Consensus、Surface、Range Image、文件读写I/O、可视化Visualization、通用库Common、Search。

Filters

http://docs.pointclouds.org/trunk/group__filters.html 

下图是一个噪声消除的示例,因为测量的误差,某些点集存在大量的噪点,而这将使得局部点云的3D特征建立复杂化。通过对每个点的邻区的统计分析,去除未达到一定标准的点,可以将其中一些异常的数据点滤去。在PCL中稀疏噪声的消除方法是在输入的点集数据中计算各点到其邻区的分布概率。对于每个点,计算其到所有相邻点的距离,假定其结果应该是符合特定均值和标准差的高斯分布,定义全局的可容忍的平均值和标准差,将所有不在可容忍误差内的点都认为是噪点而删除。

Features

How 3D Features work in PCL

特征库包含点云数据三维特征估计的数据结构和机制。三维特征是空间中特定三维点或位置的表征,这些特征基于点周围的可用信息来描述几何模式。在查询点周围选择的数据空间通常称为k-邻域。

下图显示了所选查询点及其所选k邻域的简单示例。

最常用的两个几何点特征之一是基础曲面在查询点p处的估计曲率法线。这两个特征都被认为是局部特征,因为它们使用k个最近的点邻居提供的信息来描述一个点。为了有效地确定这些邻域,通常使用空间分解技术将输入数据集分割成更小的块,如八叉树或kd树,然后在该空间中执行最近点搜索。根据应用程序可以选择确定一个固定数量的k点附近的p,或所有点在里面一个球体的半径为r的集中在p。毋庸置疑,一个最简单的方法来估计表面法线和曲率的变化在点p是执行eigendecomposition(即计算k邻域点的特征向量和特征值)。因此,对应于最小特征值的特征向量将近似点p处的曲面法向量n,而根据特征值估计曲面曲率变化为:

 

Keypoints

关键点库含有两个点云集的关键点检测算法。关键点(也叫做兴趣点)是指在一副图像或者一个点云集中能够利用一个明确标准检测出来的稳定的、独特的点。一般情况下关键点的数量要远远少于点云集中的点数。通常将关键点信息和各个关键点的本地特征信息组合起来形成一组compact-yet descriptive-representation的原始数据。

下图显示了从图像中提取的NARF关键点的输出:

Registration

将多个数据集组合成一个全局一致的模型通常使用一种称为注册(或配准)的技术来执行,即将一些点集数据在统一的世界坐标系下组合起来。关键思想是识别数据集之间的对应点,并找到最小化对应点之间距离(对齐误差)的转换。这个过程是重复的,因为对应搜索受到数据集的相对位置和方向的影响。一旦对齐错误降到给定的阈值以下,则称完成了注册(配准)。

注册库包含了的大量的点云注册算法,其可以处理的点集数据不论是否为有序。例如,PCL在强注册算法下,可以拒绝坏的点集而只将好的点集注册。

 Kd树Kd-tree

Kd树库的基础数据结构使用了FLANN,允许快速最近邻搜索。。

kd树(k-维树)是一种空间分区数据结构,它在树结构中存储一组k维的点,从而支持有效的范围搜索和最近邻搜索。最近邻搜索是处理点云数据时的核心操作,可用于查找点组或特征描述符之间的对应,或定义点周围的局部邻域。

Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索。最近邻区搜索是点云处理中的一样核心操作,在点集之间确定关联点、特征描述、点的邻区搜索时都会用到。

八叉树Octree

 八叉树库提供了直接从点云数据创建树的方法。其可支持的操作有:空间分割、下采样、和搜索。每个八叉树的节点都有八个子节点或者没有子节点(叶节点)。根节点包含囊括所有点的立方体空间,每层深度的子节点都是上层空间按各轴除2的子空间。

八叉树通常用来作邻区搜索,如相邻区间内搜索、K邻区搜索、指定半径内搜索。八叉树会自动的调整根据点集数据调整其空间尺度。叶节点还提供了一些额 外的操作,如空间的占有率查询、每空间单位内的点密度。库还提供了将八叉树编码为二进制文件以及从二进制文件解析为八叉树的功能。此外库中还使用了内存池 技术减少了频繁内存的申请和释放开销,提高了八叉树的效率。

下图展示了一个八叉树的最底层的子节点空间。每个斯坦福兔表面的点即红色的点都在八叉树子节点空间内,这幅图就是有八叉树的viewer创建。

下图演示了八叉树节点在树的最低层次上的体素包围框。八叉树体素围绕着斯坦福兔表面的每个3D点,红点代表点数据。

Segmentation

切分库包主要为将一个点云切分为多个片段簇,切分最适合处理由一些空间隔离区域组成的点云,在这种情况下,点云常常被分解为一些能够独立处理的簇。

分割库包含将点云分割成不同集群的算法。这些算法最适合处理由空间隔离区域组成的点云。在这种情况下,常常使用集群将云分解为其组成部分,然后可以独立地处理这些部分。

两个图分别展示了平面模型分割(右)和圆柱模型分割(左)的结果。

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值