PCL库简要说明

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

PCL的潜在应用领域

PCL能解决什么问题呢?

机器人领域移动机器人对其工做环境的有效感知、辨识与认知,是其进行自主行为优化并可靠完成所承担任务的前提和基础。如何实现场景中物体的有效分类与识别是
移动机器人场景认知的核心问题,目前基于视觉图像处理技术来进行场景的认知是该领域的重要方法。但移动机器人在线获取的视觉图像质量受光线变化影响较大,特别是在光线较暗的场景更难以应用,随着RGBD获取设备的大量推广,在机器人领域势必掀起一股深度信息结合2D信息的应用研究热潮,深度信息的引入可以使机器人更好地对环境进行认知、辨识,与图像信息在机器人领域的应用同样,须要强大智能软件算法支撑,PCL就为此而生,最重要的是PCL自己就是为机器人而发起的开源项目,PCL中不只提供了对现有的RGBD信息的获取设备的支持,还提供了高效的分割、特征提取、识别、追踪等最新的算法,最重要的是它能够移植到android、ubuntu等主流Linux平台上,PCL无疑将会成为机器人应用领域一把瑞士军刀。

CAD/CAM、逆向工程

大部分工业产品是根据二维或三维CAD模型制造而成,但有时由于数据丢失、设计屡次更改、实物引进等缘由,产品的几何模型没法得到,于是经常须要根据现有产品实物生成物体几何模型。逆向工程技术可以对产品实物进行测绘,重构产品表面三维几何模型,生成产品制造所需的数字化文档。

在一些工业领域,如汽车制造业,许多零件的几何模型都经过逆向工程由油泥模型或实物零件得到,目前在CAD/CAM领域利用激光点云进行高精度测量与重建成为趋势,同时引来了新的问题,经过获取的海量点云数据,来提取重建模型的几何参数,或者形状模型,对模型进行智能检索,从点云数据获取模型的曲面模型等,诸如此类
的问题解决方案在PCL中都有涉及。
例如kdtree和octree对海量点云进行高效压缩存储与管理,其中滤波、配准、特征描述与提早基础处理,能够应用于模型的智能检索,以及后期的曲面重建和可视化都在PCL中有相应的模块。总之,三维点云数据的处理是逆向工程中比较重要的一环,PCL中间全部的模块正是为此而生的。

激光遥感测量

可以直接获取高精度三维地面点数据,是对传统测量技术在高程数据获取及自动化快速处理方面的重要技术补充。激光遥感测量系统在地形测绘、环境检测、三维城市建模、地球科学、行星科学等诸多领域具备普遍的发展前景,是目前最早进的能实时获取地形表面三维空间信息和影像的遥感系统。目前,在各类提取地面点的算法中,算法结果与世界结果之间差异较大,违背了实际状况,PCL中强大的模块能够助力此处的各类需求。

虚拟现实、人机交互虚拟现实技术(简称VR),
又称灵境技术,是以沉浸性、交互性和构想性为基本特征的计算机高级人机界面。它综合利用了计算机图形学、仿真技术、多媒体技术、人工智能技术、计算机网络技术、并行处理技术和多传感器技术,模拟人的视觉、听觉、触觉等感受器官功能,令人可以沉浸在计算机生成的虚拟境界中,并可以经过语言、手势等天然的方式与之进行实时交互,建立了一种适人化的多维信息空间,具备广阔的应用前景。
android

对于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注册RegistrationKd树Kd-tree八叉树Octree切分Segmentation、Sample Consensus、Surface、Range Image、文件读写I/O、Visualization、通用库Common、Search编程

 原文地址:http://pointclouds.org/documentation/tutorials/walkthrough.php#walkthroughubuntu

过滤器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的学习,能够扫描二维码关注公众号,有兴趣的能够直接在公众号回复与我交流,相互学习,

                        

有兴趣的小伙伴能够关注微信公众号,加入QQ或者微信群,和你们一块儿交流分享吧

相关文章
相关标签/搜索