PCL库官方教程01

PCL 库概览

介绍 PCL 库的组件,简短说明各个模块的功能及其之间的交互。

概述

PCL 被拆分为多个模块化库。主要模块如下图所示:
PCL库官方教程01_第1张图片

Filters 滤波器

下图给出了一个去除噪声的例子。由于测量误差,某些数据集会出现大量的阴影点。这使得局部点云三维特征的估计变得复杂。通过对每个点的邻域执行统计分析,并删除不符合特定标准的异常值,可以过滤其中一些异常值。PCL中的稀疏离群点去除实现是基于点邻域距离分布的计算。通过假设得到的分布是具有均值和标准差的高斯分布,所有的点的平均距离都在由全局距离均值和标准差定义的区间之外,可以认为是离群点,并从数据集中裁剪。
PCL库官方教程01_第2张图片

Feature 特征

特征库包含从点云数据中进行三维特征估计的数据结构和机制。三维特征是空间某些三维点或位置的表示,它根据点周围的可用信息描述几何模式。在查询点周围选择的数据空间称为 k 邻域
下图为所选的查询点及其 k 邻域的示例:
PCL库官方教程01_第3张图片
最广泛使用的几何点特征例子是下垫面1在查询点 p 的估计曲率和法线。它们被认为是局部特征,因为它们使用一个点的 k 个最近相邻点提供的信息来描述它。为了高效确定这些邻近点,通常使用空间分解技术(如八叉树,kd树)将数据分成更小的空间块,然后在该空间执行最邻近点搜索。根据需要,可以选择查询点 p 附近确定数量的 k 个点,也可以以 p 为中心,半径为 r 的球体内确定所有点。 无疑,估计点 p 表面法线和曲率变化最简单的方法是对 k 邻域点表面进行特征分解(既计算特征向量和特征值)。因此,最小特征值对应的特征向量在点 p 处近似曲面法线 n ,而曲面变化率由特征值估计为:
λ 0 λ 0 + λ 1 + λ 2 , λ 0 < λ 1 < λ 2 . {{\lambda_0} \over {\lambda_0 + \lambda_1 + \lambda_2}} , \lambda_0 < \lambda_1 < \lambda_2. λ0+λ1+λ2λ0,λ0<λ1<λ2.
PCL库官方教程01_第4张图片

KeyPoints 关键点

关键点库包含两个点云关键点检测算法的实现。关键点指图像或点云中稳定,独特且可以使用定义良好的检测标准进行识别的点。通常,点云的关键点数量远小于点云点的总数,当与每个关键点的本地特征描述子结合使用时,关键点和描述子可用于形成原始数据的紧凑但具有描述性的表示。
从距离图像中用 NARF 关键点提取出的结果:

Registration 配准

将多组数据集融合为一个全局一致的模型通常使用称为配准的技术。关键思想是识别数据集之间的对应点,并找到对应点之间的距离(对齐误差)最小化的转换。这个过程是重复的,因为对应搜索收到数据集的相对位置和方向的影响。一旦对准误差低于给定的阈值,则配准完成。
配准库为有组织和无组织(通用)数据集实现了大量的点云配准算法。例如,PCL包含一组功能强大的算法,允许估计多组对应数据集,以及拒绝坏对应的方法,并以高鲁棒性2的方式估计转换。

Kd-tree kd树

kd 树库使用 FLANN 提供的 kd 树数据结构,允许快速最邻域搜索。
kd 树一种空间分区数据结构,它在树结构中存储 k 维点,支持高效范围搜索和最邻域搜索。最邻域搜索是处理点云数据的核心操作,用于查找点组或特征描述子之间的对应关系,或定义一个或多个点周围的局部邻域。
PCL库官方教程01_第5张图片

Octree 八叉树

八叉树库提供了从点云数据创建层次树数据结构的有效方法。这支持对点数据集进行空间分区、降采样和搜索操作。每个八叉树节点要么有八个子节点,要么没有子节点。根节点描述了一个封装了所有点的三次边界框。在每个树级别上,这个空间被细分为2倍,这导致体素分辨率的提高。
八叉树实现了高效最邻域搜索规则,例如 体素内近邻搜索k邻域搜索半径邻域搜索 。它根据点数据集自动调整其维度。一组叶节点类提供了额外的功能,例如空间“占用率”和“每体素的点密度”检查。用于序列化和反序列化的函数能够有效地将八叉树结构编码为二进制格式。此外,在需要以高速率创建八叉树的场景中,内存池实现减少了昂贵的内存分配和回收操作。
下图说明了位于最低树级的八叉树节点的体素边界框。八叉树体素围绕着斯坦福兔子表面的每一个3D点。红点表示点数据。此图像是使用八叉树查看器创建的。
PCL库官方教程01_第6张图片

Segmentation 分割

分割库包含将点云分割为不同集群的算法。这些算法最适合处理由许多空间孤立区域组成的点云。在这种情况下,常常使用聚类来将云分解为组成部分,然后可以独立地处理这些组成部分。
在聚类提取教程中可以找到解释聚类方法如何工作的理论入门。这两张图分别展示了平面模型分割(下)和圆柱体模型分割(上)的结果。
PCL库官方教程01_第7张图片

Sample Consensus 采样一致性

采样一致性库包含了 sample consensus (SAC)方法例如 RANSAC 和平面模型,圆柱体模型。为了检测点云中的特定模型及其参数,这些模型可以自由组合。
这个库中实现的一些模型包括:直线、平面、圆柱体和球体。平面拟合通常用于检测常见的室内表面,如墙壁、地板和桌面。其他模型可用于检测和分割具有常见几何结构的对象(例如,将圆柱体模型贴合到马克杯上)。

Surface 表面

表面库用于重构原始 3D 扫描的表面。这取决于具体任务,例如,这可以是船体,网格表示或光滑/重新采样的表面与法线。
如果点云是有噪声的,或者它是由多个没有完全对齐的扫描组成的,那么平滑和重新采样是很重要的。曲面估计的复杂度可以调整,如果需要,法线可以在同一步中估计。
PCL库官方教程01_第8张图片
网格划分是一种从点云中创建曲面的通用方法,目前有两种算法:一种是对原始点进行快速的三角划分,另一种是进行平滑和补孔的较慢的网格划分。
PCL库官方教程01_第9张图片
当需要简化表面表示或需要提取边界时,创建凸或凹外壳是有用的。
PCL库官方教程01_第10张图片

Range Image 距离图像

距离图像库包含两个类,用于表示和处理距离图像。距离图像(或深度图)是一种图像,其像素值表示距离传感器原点的距离或深度。距离图像是一种常见的3D表示,通常由立体视觉相机或 Tof 相机生成。通过了解相机的固有校准参数,可以将距离图像转换为点云。
PCL库官方教程01_第11张图片

I/O 读写

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

Visualization 可视化

建立可视化库的目的是能够快速原型化和可视化算法在3D点云数据上的操作结果。类似于 OpenCV 的用于显示 2D 图像和在屏幕上绘制基本 2D 形状的 highgui 例程。
pcl::PointCloud format 格式的 n 维点云数据集提供渲染和设置可视属性(颜色、点大小、不透明度等)的方法。
PCL库官方教程01_第12张图片
从点集或参数方程在屏幕上绘制基本3D形状(如圆柱体、球体、直线、多边形等)的方法;
PCL库官方教程01_第13张图片
用于2D图的直方图可视化模块 PCLHistogramVisualizer
PCL库官方教程01_第14张图片
pcl::PointCloud 数据集提供大量的几何和颜色处理程序;
PCL库官方教程01_第15张图片
PCL库官方教程01_第16张图片

Common 常用库

常用库包含大多数 PCL 库使用的常用数据结构和方法。核心数据结构包括 PointCloud 类和大量用于表示点、表面法线、RGB 颜色值、特征描述子等的点类型。它还包含许多用于计算距离/范数、均值和协方差、角度转换、几何变换等的函数。

Search 搜索

搜索库提供了使用不同数据结构搜索最邻域的方法,包括:KdTree , Octree , brute force(暴力匹配,普通的模式匹配算法) , specialized search for organized datasets(原始数据集的特异搜索???)

Binaries 二进制文件

提供了 PCL 常用工具的快速参考。
pcl::viewer :一种快速预览 PCD 文件的方法。
语法规则: pcl_viewer .
其中 选项有:
-bc r,g,b = background color 设置背景色
-fc r,g,b = foreground color 设置前景色
-ps X = point size (1..64) 设置点大小
-opaque X = rendered point cloud opacity (0..1) 设置点云不透明度
-ax n = enable on-screen display of XYZ axes and scale them to n XYZ 轴以及尺度的显示
-ax_pos X,Y,Z = if axes are enabled, set their X,Y,Z position in space (default 0,0,0) 设置 XYZ 轴的位置
-cam (*) = use given camera settings as initial view 使用给定的相机设置作为初始视图
-multiview 0/1 = enable/disable auto-multi viewport rendering (default disabled)
启动/禁用自动多视角渲染
-normals 0/X = disable/enable the display of every Xth point’s surface normal as lines 禁用/启用显示每个点 X 的表面法线
-pc 0/X = disable/enable the display of every Xth point’s principal curvatures as lines 禁用/启用每个点 X 的主曲率为直线
例子:
pcl_viewer -multiview 1 data/partial_cup_model.pcd data/partial_cup_model.pcd data/partial_cup_model.pcd
上面的指令加载同一个 PCD 文件 3 次,并且在一个窗口显示。
PCL库官方教程01_第17张图片

pcl_pcd_convert_NaN_nan 转换 NaN 值为 nan 值(PCL 在 1.0.1 版本开始 NaN 改为 nan)
例子:
pcl_pcd_convert_NaN_nan input.pcd output.pcd

pcl_convert_pcd_ascii_binary 将PCD(点云数据)文件从ASCII转换为二进制,反之亦然。
例子:
pcl_convert_pcd_ascii_binary 0/1/2 (ascii/binary/binary_compressed) [precision (ASCII)]

pcl_concatenate_points_pcd 将两个或多个PCD(点云数据)文件中的点连接到一个PCD文件中。
例子:
pcl_concatenate_points_pcd

pcl_pcd2vtk 将PCD(点云数据)文件转换为VTK格式。
例子:
pcl_pcd2vtk input.pcd output.vtk

pcl_pcd2ply 将PCD(点云数据)文件转换为PLY格式。
例子:
pcl_pcd2ply input.pcd output.ply

pcl_mesh2pcd 使用光线追踪技术,将CAD模型转换为PCD(点云数据)文件。
语法:pcl_mesh2pcd input.{ply,obj} output.pcd
其中 选项有:
-level X = tessellated sphere level (default: 2) 完全嵌合球水平
-resolution X = the sphere resolution in angle increments (default: 100 deg) 球体分辨率的角度增量
-leaf_size X = the XYZ leaf size for the VoxelGrid – for data reduction (default: 0.010000 m) 体素滤波降采样,XYZ 的大小

pcl_octree_viewer 允许八叉树可视化
语法:octree_viewer
例子:
Example: ./pcl_octree_viewer ../../test/bunny.pcd 0.02
PCL库官方教程01_第18张图片


  1. 下垫面在这里应该是指物体的表面特征。 ↩︎

  2. 鲁棒性指在异常和危险情况下系统稳定运行的能力。 ↩︎

你可能感兴趣的:(人工智能,计算机视觉,机器学习,机器人,算法)