本文主要是介绍点云库(PCL)学习——overview,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
overview
PCL是由几个模块库构成的:
Filters, Features, Keypoints, Registration, KdTree, Octree, Segmentation, Sample Consensus, Surface, Range Image, I/O, Visualization, Common, Search.
- Filters
背景:下图给出了噪声消除的示例。由于测量误差,某些数据集会出现大量的阴影点。这使得局部点云三维特征的估计变得复杂。通过对每个点的邻域进行统计分析,并对不符合特定标准的点进行修剪,可以过滤出其中一些异常值。通过计算输入数据集中点到邻域距离分布,可以去除PCL中稀疏离群点。对于每个点,计算其到所有相邻点的平均距离。假设得到的分布是具有平均值和标准偏差的高斯分布,所有平均距离在由全局距离平均值和标准偏差定义的区间之外的点都可以被视为离群值,并从数据集中进行修剪。
- Features
背景:features库包含数据结构以及点云数据的三维特征估计的机制。三维特征是空间中某些三维点或位置上的表示,基于该点周围可用的信息来描述几何图形。围绕查询点选择的数据空间通常称为k邻域。
一个例子:有两个广泛使用的几何点特征,即,在查询点p处的表面的估计曲率和法向量。它们都被称为局部特征,因为是通过p处最近的k个邻点提供的信息所赋予的。为了高效地确定这些邻点,通常利用空间分解技术例如octrees或KD-trees将输入的点集划分成几个小块(small chunks),然后在这个空间中搜寻最近的点。根据应用的不同,我们既可以选择p点附近固定数量的k个点,也可以选择p点为中心,r为半径的球里的所有点。毫无疑问,估计p点的曲面法线和曲率变化的最简单方法之一是对k邻域点曲面片进行特征分解(即计算特征向量和特征值)。因此,对应于最小特征值的特征向量就接近点p处曲面的法向量n,而曲面的曲率变化将通过特征值估计:其中 - Keypoints
背景:keypoints库包含两个点云关键点检测算法的实现。关键点(也称为兴趣点,interest points)是图像或点云中的点,它们是稳定的、独特的,并且可以使用定义良好的检测标准来识别。通常,点云中的兴趣点的数量将远小于点云中的点的总数,并且当与每个关键点的局部特征描述符结合使用时,关键点和描述符可用于形成原始数据的紧凑的表示即便是描述性的。下图显示了从距离图像中提取NARF关键点的输出:
- Registration
背景:将几个数据集合合并成一个全局一致性的模型通常要用到一种叫**registration(配准)**的技术。其关键思想是识别数据集之间的对应点,并找到一种使对应点之间的距离(对齐误差)最小化的变换。这个过程是重复的,因为对应搜索受数据集的相对位置和方向的影响。一旦对准误差低于给定的阈值,则称为完成配准。registration库为有组织的和无组织的(通用)数据集合实现了大量的点云配准算法。例如,PCL包含了一组强大的算法,允许多组对应点进行估计,也提供了拒绝效果很差的对应(bad correspondences),以一种稳健的方式进行变换。
- Kd-tree
背景:Kd-tree库提供了kd-tree数据结构,使用FLANN可以允许最近邻搜索。Kd-tree(k-dimensional tree)是一种空间分区数据结构,它将一组k维点存储在树结构中,从而实现有效的范围搜索和最近邻搜索。最近邻搜索是处理点云数据时的核心操作,可用于查找点组(points group)之间或特征描述符之间的对应关系,或定义点周围的局部邻域。
- Octree
背景:Octree(八叉树)库提供了从点云数据创建层次树数据结构的有效方法。这样就可以对点数据集进行空间分区、降采样和搜索操作。每个八叉树节点要么有八个子节点,要么没有子节点。根节点描述一个封装所有点的立方体边界框。在每个树级别,这个空间被2的因子细分,从而提高体素分辨率。八叉树的实现提供了高效的近邻搜索例程,例如“体素内邻居搜索”、“K近邻搜索”和“半径内邻居搜索”。它会根据点数据集自动调整其尺寸。一组叶节点类提供了额外的功能,例如空间“占用率”和“每体素点密度”检查。用于序列化和反序列化的函数可以有效地将八叉树结构编码为二进制格式。此外,在需要高速创建八叉树的情况下,内存池实现减少了昂贵的内存分配和释放操作。下图演示了最低树级别的八叉树节点的体素边界框。八叉树体素围绕着斯坦福兔子表面的每个3D点。红点代表点数据。此图像是使用八叉树查看器创建的。
- Segmentation
背景:Segmentation库包含将点云分割为不同簇(clusters)的算法。这些算法最适合处理由多个空间隔离区域组成的点云。在这种情况下,通常使用聚类技术将点云分解为几个组成部分,然后可以独立处理。这两幅图展示了平面模型分割(左)和圆柱体模型分割(右)的结果。
- Sample Consensus
背景:Sampe Consensus库包含样本一致性(SAmple Consensus,SAC)方法(如RANSAC)和模型(如平面和圆柱体)。这些可以自由组合,以便检测点云中的特定模型及其参数。此库中实现的一些模型包括:直线、平面、圆柱体和球体。平面拟合通常用于检测常见的室内表面,如墙壁、地板和桌面。其他模型可用于检测和分割具有常见几何结构的对象(例如,将圆柱体模型拟合到马克杯)。
- Surface
背景:Surface库处理从三维扫描重建原始曲面。根据手头的任务,这可以是外壳、网格表示或具有法线的平滑/重采样曲面。如果点云云是有噪声的,或者由多个没有完全对齐的扫描组成,平滑和重采样就很重要了。可以调整曲面估计的复杂度,如果需要,可以在同一步中估计法线。
网格划分是一种利用点创建曲面的通用方法,目前提供了两种算法:一种是对原始点进行快速三角剖分,另一种是进行平滑和填充孔的较慢的网格划分。
例如,当需要简化曲面表示或需要提取边界时,创建凸面或凹面外壳非常有用。
- Range Image
背景:Range Image库包含两个用于表示和处理范围图像的类。范围图像(range image,或深度图,depth map)是一种图像,其像素值表示距离传感器原点的距离或深度。距离图像是一种常见的三维表示,通常由立体相机或者time-of-flight相机生成。通过了解摄像机的固有标定参数,可以将距离图像转换为点云。 - I/O
背景:io库包含读取和写入点云数据(PCD)文件的类和功能,以及从各种传感设备捕获点云。 - Visualization
背景:建立可视化库的目的是能够快速原型化和可视化算法在三维点云数据上的运行结果。与OpenCV用于显示2D图像和在屏幕上绘制基本2D形状的highgui例程类似,该库提供:
以在pcl::PointCloud format呈现和设置任意n-D点云数据集的视觉特性(颜色、点大小、不透明度等)的方法;
从点集或参数方程绘制屏幕上基本三维形状的方法(例如圆柱体、球体、直线、多边形等);
二维图形直方图可视化模块(PCLHistogramVisualizer);
pcl::PointCloud数据集的大量几何图形和颜色处理程序;
pcl::RangeImage 可视化模块
该软件包利用VTK库进行范围图像和二维操作的三维渲染。
要实现您自己的可视化工具,请查看库附带的测试和示例。 - Common
背景:Common库包含大多数PCL库使用的公共数据结构和方法。核心数据结构包括PointCloud类和用于表示点、曲面法线、RGB颜色值、特征描述符等的多种点类型。它还包含许多用于计算距离/规范、均值和协方差、角度转换、几何变换等的函数。 - Search
Search库提供了利用不同的数据结构来搜多最近邻的方法,包括:KdTree, Octree, brute force, specialized search for organized datasets - Binaries
本节提供了PCL中一些常用工具的快速参考。
Reference
PCL Walkthrough
这篇关于点云库(PCL)学习——overview的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!