PointCloudLib-1.12.1学习笔记

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

PCL起初是ROS(Robot Operating System)下由来自于慕尼黑工业大学(TUM - Technische Universität München)和斯坦福大学(Stanford University)Radu博士等人维护和开发的开源项目,主要应用于机器人研究应用领域,随着各个算法模块的积累,于2011年独立出来,正式与全球3D信息获取、处理的同行一起,组建了强大的开发维护团队,以多所知名大学、研究所和相关硬件、软件公司为主。

结构和内容

如《PCL架构图》所示,对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。

PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。

从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤,特征估计,表面重建模型拟合和分割,定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。

过滤器

下图给出了噪声消除的示例。由于测量误差,某些数据集会出现大量阴影点。这使得局部点云 3D 要素的估计变得复杂。其中一些异常值可以通过对每个点的邻域执行统计分析并修剪不符合特定条件的邻域来过滤。PCL 中的稀疏异常值去除实现基于对输入数据集中点到相邻距离分布的计算。对于每个点,将计算从该点到其所有相邻点的平均距离。通过假设生成的分布是具有平均值和标准差的高斯分布,则平均距离超出由全局距离平均值和标准差定义的区间之外的所有点都可以被视为异常值并从数据集中修剪。

特征

可以在 3D 功能教程中找到解释特征在 PCL 中如何工作的理论入门。

特征库包含用于从点云数据进行 3D 特征估计的数据结构和机制。3D 要素是空间中某些 3D 点或位置处的制图表达,它根据点周围的可用信息描述几何图案。在查询点周围选择的数据空间通常称为 k 邻域。

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

使用最广泛的两个几何点要素的示例是基础表面的估计曲率和查询点处的法线。它们都被视为局部要素,因为它们使用最近点邻域提供的信息来表征点。为了有效地确定这些相邻点,通常使用空间分解技术(如八叉树或 kD 树)将输入数据集拆分为较小的块,然后在该空间中执行最近点搜索。根据应用的不同,可以选择确定 附近的固定点数,也可以选择确定半径球体内以 为中心的所有点。毫无疑问,估计一个点的表面法线和曲率变化的最简单方法是执行 k 邻域点表面曲面块的特征分解(即计算特征向量和特征值)。因此,对应于最小特征值的特征向量将近似于点的表面法线,而表面曲率变化将从特征值估计为  。

关键点

关键点库包含两个点云关键点检测算法的实现。关键点(也称为兴趣点)是图像或点云中稳定、独特且可以使用明确定义的检测标准进行识别的。通常,点云中的兴趣点数将远小于云中的点总数,并且当与每个关键点的局部特征描述符结合使用时,关键点和描述符可用于形成原始数据的紧凑但描述性表示。

注册

将多个数据集组合成一个全局一致的模型通常使用一种称为配准的技术来执行。关键思想是识别数据集之间的相应点,并找到一种转换,以最小化相应点之间的距离(对齐误差)。重复此过程,因为通信搜索受数据集的相对位置和方向的影响。一旦对齐误差低于给定阈值,则称配准完成。

配准库为有组织和无组织(通用)数据集实现了大量的点云配准算法。例如,PCL 包含一组强大的算法,允许估计多组对应关系,以及拒绝不良对应关系和以稳健方式估计转换的方法。

KD树

解释 Kd 树如何工作的理论入门可以在 Kd 树教程中找到。

kdtree 库使用 FLANN 提供 kd-tree 数据结构,允许快速的最近邻搜索

Kd 树(k 维树)是一种空间分区数据结构,它将一组 k 维点存储在树结构中,从而实现高效的范围搜索和最近邻搜索。最近邻搜索是处理点云数据时的核心操作,可用于查找点组或要素描述符之间的对应关系,或定义一个或多个点周围的局部邻域。

八叉树

八叉树库提供了从点云数据创建分层树数据结构的有效方法。这样就可以对点数据集进行空间分区、缩减采样和搜索操作。每个八叉树节点有八个子节点或没有子节点。根节点描述封装所有点的立方边界框。在每个树级别,此空间被细分为 2 倍,从而导致体素分辨率提高。

八叉树实现提供了高效的最近邻搜索例程,例如“体素搜索内的邻居”、“K 最近邻搜索”和“半径搜索内的邻居”。它根据点数据集自动调整其维度。一组叶节点类提供附加功能,例如空间“占用”和“每个体素的点密度”检查。序列化和反序列化函数能够有效地将八叉树结构编码为二进制格式。此外,内存池实现减少了需要在需要以高速率创建 octree 的情况下昂贵的内存分配和释放操作。

分割

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

可以在聚类提取教程中找到解释聚类方法如何工作的理论入门。

共识样本

sample_consensus库包含 SAmple 共识 (SAC) 方法(如 RANSAC )和模型(如平面和圆柱体)。它们可以自由组合,以便在点云中检测特定模型及其参数。

解释样本共识算法如何工作的理论入门可以在随机样本共识教程中找到

此库中实现的一些模型包括:直线、平面、圆柱体和球体。平面拟合通常用于检测常见的室内表面(如墙壁、地板和桌面)的任务。其他模型可用于检测和分割具有常见几何结构的物体(例如,将圆柱体模型安装到杯子上)。

表面

表面库处理从3D扫描重建原始表面。根据手头的任务,这可以是例如船体、网格表示或具有法线的平滑/重采样表面。

如果云有噪点,或者云由多个未完全对齐的扫描组成,则平滑和重新采样可能很重要。可以调整表面估计的复杂性,如果需要,可以在同一步骤中估计法线。

网格划分是从点创建表面的通用方法,目前提供了两种算法:原始点的非常快速的三角测量,以及进行平滑和孔填充的较慢网格划分。

例如,当需要简化的曲面表示或需要提取边界时,创建凸包或凹包非常有用。

深度图

range_image库包含两个用于表示和处理范围图像的类。距离图像(或深度图)是其像素值表示距传感器原点的距离或深度的图像。范围图像是一种常见的 3D 表示形式,通常由立体或飞行时间摄像机生成。了解相机的固有校准参数后,可以将范围图像转换为点云。

注意:range_image现在是通用模块的一部分。

输入输出(I/O)

io库包含用于读取和写入点云数据(PCD)文件的类和函数,以及从各种传感设备捕获点云。

可视化

构建可视化库的目的是能够快速原型化和可视化在 3D 点云数据上运行的算法的结果。与OpenCV用于显示2D图像和在屏幕上绘制基本2D形状的highgui例程类似,该库提供:

用于渲染和设置任何 n-D 点云数据集的视觉属性(颜色、点大小、不透明度等)的方法

 

 

0

0

0

用于 pcl::P ointCloud 数据集的大量几何和颜色处理程序;

0

猜你喜欢

转载自blog.csdn.net/linux_huangyu/article/details/131975428
今日推荐