(一)PCL总览

PCL总览

这个教程会带你从头到尾学习PCL的各个部分,简要描述PCL的各个模块,并列出不同部分之间的联系

概述

PCL被分成了许多模块化的库,下面是其中最重要的模块:

下面对各个模块进行介绍:

滤波器(Filters)

背景

下图展示了一个去噪的例子。由于测量的误差,一些数据表现为背景点(shadow points)。这让获取点云的3D特征变得困难。其中的一些外点(outliers)可以通过对每个点的邻域进行静态分析判断出来,并将它们去除。对稀疏的外点的去除,在PCL中是基于计算每个点与它周围点的距离分布而确定的。通过假定这个分布符合高斯分布,并得到全局的高斯分布参数(均值和标准差)与每个点比较,差距较大的就定义为外点,并将其去除。

特征(Features)

背景

特征库包含了对点云数据的3D特征估计的过程中用到的数据结构和机制。3D特征在空间中以点或坐标的形式表示,它描述了围绕着这个点的几何图案。对于查询点(query point)周围选取的空间,被称作K邻域(k-neighborhood)。
下图展示了一个查询点和它周围被选取的k邻域(k个最近邻点)。

例如,对于一个查询点$p$而言,它的周围存在一个潜在的曲面,我们经常会用到它的两个特征,一个是这个曲面的曲率(curvature),另一个是它的法向量(normal)。这两个特征被称为局部特征(local features),因为它们是通过点$p$的k邻域得到的。而为了高效地确定这些邻点,我们要将输入的点云数据在空间中分成一小块一小块的,这其中就要用到八叉树(octrees)或者kd树(kd-trees),然后再从这些小块空间中找到距离点$p$最近的点(==下图中,左:kd树,右:八叉树==)。根据需求,我们可以找到确定数目的k个邻点,或者是以点$p$为球心,在以$r$为半径的球形区域中找邻点。毋庸置疑,要求曲面的法向量和它的曲率变化,最简单的方法就是对这个曲面进行特征分解(也就是,求特征向量和特征值)。对应于最小特征值的特征向量就可以近似表示曲面在$p$处的法向量$n$,而曲面的曲率变化可以用下面的由==特征值得到的公式==表示:
$\frac{\lambda_0}{\lambda_0+\lambda_1+\lambda_2},\lambda_0 <\lambda_1<\lambda_2$

特征点(Keypoints)

背景

PCL库中的特征点模块包含了对两幅点云中特征点的检测==和匹配==算法。特征点(Keypoints),也被叫做兴趣点(interest points)是一幅图片或点云中最稳定,最特殊,而且可以通过一些定义明确的检测标准检测出来的点。一般来说,特征点的数量远远小于点云中所有点的数量。==当这些特征点与局部特征描述子(local feature descriptors)结合后,就可以对原始数据进行描述性表示了。==
下图表示了从一幅距离图像中提取得到的NARF特征点:
image

配准

背景

将一些不同的数据集结合起来,放在一个全局一致的模型中,这个过程就叫做配准(registration)。配准的关键之处在于–确定不同数据集中的对应点(corresponding points),然后找到一个变换,使得对应点之间的“距离”(配准误差)最小。因为数据集之间的相对位置和方向会影响对应点的搜寻,因此搜寻对应点的过程是重复性的,直到配准误差低于我们定的一个门限。
对有序和无序点云(一般意义上的点云),配准库都有算法对其配准进行实现。例如,PCL包含了许多强大的算法,这些算法健壮地在多个数据集中找到对应点集,然后从中剔除匹配不够好的点对,然后得到数据集的变换关系。
image
image

kd树(kd-tree)

背景

kd树模块提供了kd树的结构,通过FLANN可以达到最近邻点搜索的目的。
一个kd树(k-dimensional tree)就是一种空间分割的数据结构,它存储了k维点的数据集,通过kd树我们可以高效地进行范围搜索和最邻近点的搜索。对于点云处理来说,最邻近点搜索是一项关键操作,它可以用来从多个点云中找到对应点,可以用来特征描述子的构造,确定点或者多个点的邻域等。
image
image

八叉树

背景

八叉树可以从点云数据中高效地创建一种分层的树状数据结构。这种数据结构可以用来进行空间分割,降采样和对点云的搜寻操作。每个八叉树的结点有八个子节点或者是一个子节点都没有。一个根节点描述为一个立方体盒子(体素),==这个盒子的顶点就是他的8个儿子。在树的每层,空间会被分为两倍,这就导致了体素分辨率的增加。==
八叉树的实现提供了高效计算最近邻点的方式,比如:“体素内的邻点查找”,“k个最近邻点查找”和“半径范围内的邻点查找”。它可以自动调整点集的维数。对于叶子结点,它们提供了其他的功能,比如检测“空间占有率”和每个体素内的点密度。序列化和反序列化可以高效地将八叉树结构编码为二进制格式。此外,内存池的实现减少了内存分配和重新分配操作,这对于八叉树需要经常创建的场景而言十分方便。
下图显示了一个八叉树的最底层的结点的体素边界盒。这些八叉树体素包围在斯坦福兔子的每个3D点周围。红色的点表示3D点数据。
image

点云分割

背景

分割模块包含了一些可以将一个点云分割多个不同集群的算法。对于由许多空间上孤立的区域组成的点云来说,这些算法很适合。一些实例中,聚类被用来将点云分割为多个组成部分,这些组成部分可以单独被处理。
下面两张图显示了一个平面模型的分割结果(左)和桶状模型的分割结果(右):
image
image

抽样一致

背景

==抽样一致库包含了随机抽样一致算法(RANSAC)和诸如平面、圆柱体模型检测==.它们可以自由地组合在一起用来检测特定模型和在点云中的参数。
在这个库中实现了一些模型:线,面,圆柱模型和球模型。平面模型的检测经常用于室内平面检测任务中,比如墙,地面和桌子的平面。常见几何结构,其他模型可以用来检测并分割物体。(比如检测杯子为一个圆柱模型)
image

表面

背景

表面库实现了将3D扫描的原始表面进行重建的工作。根据你的目的,你可以选择使用多边形外壳,网格表示或者用带法线的,平滑的/重采样的平面表示。
对于一个包含很多噪声的点云或者由多个对齐不是很准的扫描仪采集的点云来说,平滑和重采样就显得至关重要了。表面估计的复杂程度是可以调整的,如果需要也可以将法线估计出来。
image
网格化是利用点集重建出平面的一个通用的方法,这里提供了两种算法:对原始点云的快速三角化和一个带平滑,补洞的较慢的网格化。
image
当我们需要一个简化的平面表示或当边界需要被提取出来的时候,构建一个凹的或凸的外壳是十分有用的。
image

距离图像

背景

距离图像库包含了两个类来表示距离图和对其进行操作。距离图(或深度图)的每个像素值表示了从传感器到测量物体的距离或深度。距离图是一种常用的3D表示方法,并且可以由立体相机或TOF相机得到。在得到相机标定的内参之后,我们就可以将一个深度图转换为一个点云。
image

输入/输出(I/O)

背景

I/O包括了一些方法和类,用来读写点云数据和通过各种传感器来获得点云。

可视化(visualization)

背景

可视化库的目的是快速的将处理后的点云显示出来。类似OpenCV的highgui是用来显示2D图像的,可视化库提供了如下的功能:
对于在 pcl::PointCloud format中定义的n维点集,可视化库可以将它们渲染出来,同时设置可视化的属性(点的颜色,点大小,透明度等等):
image
在屏幕上渲染出来一些基本的3D图形(如,圆柱体,球,直线,多边形等):
image
二维上绘制直方图模型(PCLHistogramVisualizer):
image
提供针对 pcl::PointCloud 数据==集的许多几何和颜色上的处理程序==:
image
image
这个库利用VTK库来对3D渲染距离图像并进行2D操作。

常用库(Common)

背景

Common库中包含了PCL库中常用的数据结构和方法。其中包括了点云类,多种点类型,表面发现,RGB彩色值,特征描述子等等。==它也包含了许多方法来计算距离/法线,均值,方差,角转换,几何变换等等。==

搜寻库(Search)

背景

搜寻库提供了多种寻找最近邻点的数据结构。包括:
- KdTree
- Octree
- brute force
- 对有序点集的特殊寻找

二进制库(Binaries)

这部分主要给PCL中的常用工具提供了一个快速参考。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值