PCL(PointCloudLibrary)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、MacOSX、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用 。
PCL的潜在应用领域
PCL能解决什么问题呢?
机器人领域移动机器人对其工作环境的有效感知、辨识与认知,是其进行自主行为优化并可靠完成所承担任务的前提和基础。如何实现场景中物体的有效分类与识别是
移动机器人场景认知的核心问题,目前基于视觉图像处理技术来进行场景的认知是该领域的重要方法。但移动机器人在线获取的视觉图像质量受光线变化影响较大,特别是在光线较暗的场景更难以应用,随着RGBD获取设备的大量推广,在机器人领域势必掀起一股深度信息结合2D信息的应用研究热潮,深度信息的引入能够使机器人更好地对环境进行认知、辨识,与图像信息在机器人领域的应用一样,需要强大智能软件算法支撑,PCL就为此而生,最重要的是PCL本身就是为机器人而发起的开源项目,PCL中不仅提供了对现有的RGBD信息的获取设备的支持,还提供了高效的分割、特征提取、识别、追踪等最新的算法,最重要的是它可以移植到android、ubuntu等主流Linux平台上,PCL无疑将会成为机器人应用领域一把瑞士军刀。
CAD/CAM、逆向工程
大部分工业产品是根据二维或三维CAD模型制造而成,但有时因为数据丢失、设计多次更改、实物引进等原因,产品的几何模型无法获得,因而常常需要根据现有产品实物生成物体几何模型。逆向工程技术能够对产品实物进行测绘,重构产品表面三维几何模型,生成产品制造所需的数字化文档。
在一些工业领域,如汽车制造业,许多零件的几何模型都通过逆向工程由油泥模型或实物零件获得,目前在CAD/CAM领域利用激光点云进行高精度测量与重建成为趋势,同时引来了新的问题,通过获取的海量点云数据,来提取重建模型的几何参数,或者形状模型,对模型进行智能检索,从点云数据获取模型的曲面模型等,诸如此类
的问题解决方案在PCL中都有涉及。
例如kdtree和octree对海量点云进行高效压缩存储与管理,其中滤波、配准、特征描述与提前基础处理,可以应用于模型的智能检索,以及后期的曲面重建和可视化都在PCL中有相应的模块。总之,三维点云数据的处理是逆向工程中比较重要的一环,PCL中间所有的模块正是为此而生的。
激光遥感测量
能够直接获取高精度三维地面点数据,是对传统测量技术在高程数据获取及自动化快速处理方面的重要技术补充。激光遥感测量系统在地形测绘、环境检测、三维城市建模、地球科学、行星科学等诸多领域具有广泛的发展前景,是目前最先进的能实时获取地形表面三维空间信息和影像的遥感系统。目前,在各种提取地面点的算法中,算法结果与世界结果之间差别较大,违背了实际情况,PCL中强大的模块可以助力此处的各种需求。
虚拟现实、人机交互虚拟现实技术(简称VR),
又称灵境技术,是以沉浸性、交互性和构想性为基本特征的计算机高级人机界面。它综合利用了计算机图形学、仿真技术、多媒体技术、人工智能技术、计算机网络技术、并行处理技术和多传感器技术,模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间,具有广阔的应用前景。
对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN(FastLibraryforApproximateNearestNeighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布
PCL包括多个子模块库。最重要的PCL模块库有如下:过滤器Filters、特征Features、关键点Keypoints、注册Registration、Kd树Kd-tree、八叉树Octree、切分Segmentation、Sample Consensus、Surface、Range Image、文件读写I/O、Visualization、通用库Common、Search
原文地址:http://pointclouds.org/documentation/tutorials/walkthrough.php#walkthrough
过滤器Filters
下图是一个噪音消除的示例。因为测量的误差,某些点集存在大量的阴影点,而这将使得局部点云的3D特征建立复杂化。通过对每个点的邻区 的统计分析,削除未达到一定标准的点,可以将其中一些异常的数据点滤去。在PCL中稀疏噪音的消除方法是在输入的点集数据中计算各点到其邻区的分布概率。 对于每个点,计算其到所有相邻点的距离,假定其结果应该是符合特定均值和标准差的高斯分布,定义全局的可容忍的平均值和标准差,将所有不在可容忍误差内的 点都认为是噪音点而删除。
特征Features
在3D特征教程里有一个例子展示了特征的基本理论。
特征库包括数据结构和从点云建立3D特征的方法。3D特征为对于特定点其周围的可用的几何关系信息,如特定的三维点、位置或空间。对于查询点周围的点云数据通常简称为k-neighborhood。
两个最广泛使用的几何点属性是曲面的曲率估计和查询点p的法线。利用点的k-neighborhood计算所得的这两个属性都可以作为本地特征。为 了确定有效的k-neighborhood点云数据,输入的点云数据通常会按空间划分为多个小块区域,如八叉树或KD-trees,然后在这些区域中查找 相邻的点数据。根据具体的应用情况,可以选择p点附近的固定数量的k个点或者是距离p点r距离内的所有点。毫无疑问,最简单的计算p点的法线和曲率变化的 方法是在k-neighborhood点曲面中将特征分解计算(例如分别计算特征向量和特征值),当特征值最小时所相关的特征向量即可近似为p点的法向 量,同时曲面的曲率变化可以通过如下公式计算得到:(曲率变化计算不理解其推导过程,后续理解后在详述)。
关键点Keypoints
关键点库含有两个点云集的关键点检测算法。关键点(也叫做兴趣点)是指在一副图像或者一个点云集中能够利用一个明确标准检测出来的稳定的、独特的 点。一般情况下关键点的数量要远远少于点云集中的点数。通常将关键点信息和各个关键点的本地特征信息组合起来形成一组compact—yet descriptive—representation的原始数据。
注册Registration
将一些点集数据在统一的世界坐标系下组合起来即为注册。其关键在于确定各个点集之间的关联点,计算出各个关联点之间最近似的变换矩阵,对所有的原始数据集不停的重复此过程直到,直到出现各个点集之间的对齐误差小于指定的阈值,即可认为注册过程完成。
注册库包含了的大量的点云注册算法,其可以处理的点集数据不论是否为有序。例如,PCL在强注册算法下,可以将拒绝坏的点集而只将好的点集注册。
Kd树Kd-tree
Kd树的基本原理可以在其基础教程里了解。
Kd树库的基础数据结构使用了FLANN以便可以快速的进行邻区搜索。
Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索。最近邻区搜索是点云处理中的一样核心操作,在点集之间确定关联点、特征描述、点的邻区搜索时都会用到。
八叉树Octree
八叉树库提供了直接从点云数据创建树的方法。其可支持的操作有:空间分割、下采样、和搜索。每个八叉树的节点都有八个子节点或者没有子节点(叶节点)。根节点包含囊括所有点的立方体空间,每层深度的子节点都是上层空间按各轴除2的子空间。
八叉树通常用来作邻区搜索,如相邻区间内搜索、K邻区搜索、指定半径内搜索。八叉树会自动的调整根据点集数据调整其空间尺度。叶节点还提供了一些额 外的操作,如空间的占有率查询、每空间单位内的点密度。库还提供了将八叉树编码为二进制文件以及从二进制文件解析为八叉树的功能。此外库中还使用了内存池 技术减少了频繁内存的申请和释放开销,提高了八叉树的效率。
下图展示了一个八叉树的最底层的子节点空间。每个斯坦福兔表面的点即红色的点都在八叉树子节点空间内,这幅图就是有八叉树的viewer创建。
切分Segmentation
切分库包主要为将一个点云切分为多个片段簇。切分最适合处理由一些空间隔离区域组成的点云,在这种情况下,点云常常被分解为一些能够独立处理的簇。
关于簇的基本原理可以到其簇的提取教程里面了解。下面两幅图分别展示了片面模型(左)的切分和圆柱模型(右)的切分。
备注:关于点云库PCL的学习,可以扫描二维码关注公众号,有兴趣的可以直接在公众号回复与我交流,相互学习,