本教程将引导您完成PCL安装的组件,提供模块的简短说明,指明它们的位置,并列出不同组件之间的交互。
概观
PCL分成许多模块化库,最重要的一组发布的PCL模块如下所示:
过滤器
背景
下图显示了一个噪音消除的例子。由于测量误差,某些数据集呈现大量阴影点。这使局部点云3D特征的估计变得复杂。这些异常值中的一部分可以通过对每个点的邻域进行统计分析,并对不符合特定标准的那些进行修剪。PCL中的稀疏异常值去除实现基于输入数据集中的点到相邻距离的分布的计算。对于每个点,计算从它到所有邻域的平均距离。假设由此产生的分布是具有均值和标准差的高斯分布。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
特征
背景
在3D功能教程中可以找到解释PCL功能如何工作的理论入门知识。
该功能库中包含的数据结构和机制,从点云数据3D功能估计。3D特征是在特定3D点或空间位置的表示,其基于点周围可用的信息来描述几何图案。在查询点周围选择的数据空间通常被称为k邻域。
下图显示了所选查询点及其所选k邻域的一个简单示例
两个最广泛使用的几何点特征的一个例子是在查询点的下层曲面的估计曲率和法线p。它们都被认为是本地特征,因为它们使用k最近点邻域提供的信息来表征一个点。为了有效地确定这些邻域,使用诸如八叉树或kD树(参见下图 - 左:kD-tree,右:八叉树)的空间分解技术将输入数据集通常分割成更小的块,然后执行最近点搜索在那个空间里 取决于应用,可以选择确定k在附近的固定数量的点p,或者以半径r为中心的球体内的所有点p。p毫无疑问,估算曲面法线和曲率变化的最容易的方法是进行k邻点点曲面片的特征分解(即计算特征向量和特征值)。因此,与最小特征值对应的特征向量将近似于n点的表面法线p,而表面曲率变化将从特征值估计为:
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
关键点
背景
该关键点库包含两个点云的关键点检测算法实现。关键点(也称为兴趣点)是图像或点云中稳定、独特的点,可以使用明确的检测标准进行识别。通常情况下,点云中兴趣点的数量将远小于云中的总点数,并且当与每个关键点处的局部特征描述符结合使用时,可以使用关键点和描述符来形成紧凑的点,对原始数据进行描述性表示。
下图显示了从距离图像中提取NARF关键点的输出:
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
配准
背景
将几个数据集组合成全局一致模型通常使用称为配准的技术来执行。关键的思想是确定数据集之间的对应点,并找到一个最小化相应点之间的距离(对齐误差)的变换。这个过程是重复的,因为对应关系搜索受到数据集的相对位置和方向的影响。一旦对齐错误低于给定的阈值,就说配准完成。
所述配准库实现的点云配准算法过多两个组织无组织(一般用途)的数据集。例如,PCL包含一组强大的算法,可以估计多组对应关系,以及拒绝不良对应关系的方法,以及以可靠的方式估计变换。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
kd树
背景
在Kd-tree教程中可以找到解释Kd树如何工作的理论入门知识。
该kdtree库提供了kdtree数据结构,采用FLANN,允许快速近邻查询。
kd树(k维树)是一个空间的分割数据结构,用于存储一组在一个树结构,能够有效范围搜索和最近邻搜索k维点。最近邻搜索是使用点云数据时的核心操作,可用于查找点或特征描述符组之间的对应关系,或定义一个或多个点周围的局部邻域。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
八叉树
背景
所述八叉树库提供用于创建从点云数据的分层树数据结构的有效方法。这使得点数据集上的空间分区,下采样和搜索操作成为可能。每个八叉树节点有八个孩子或没有孩子。根节点描述了封装所有点的立方体边界框。在每一个树木层面,这个空间被细分为2倍,这导致体素分辨率的增加。
在八叉树的实现提供了有效的近邻搜索程序,如“体素的搜索范围内的邻居”,“K最近邻搜索”和“邻居半径内搜索”。它会自动将其维度调整为点数据集。一组叶节点类提供附加功能,例如空间“占用”和“每个体素的点密度”检查。用于序列化和反序列化的函数能够将八叉树结构有效地编码为二进制格式。此外,内存池的实现可以在需要高速创建八进制数的场景中减少昂贵的内存分配和重新分配操作。
下图说明了最低树级别的八叉树节点的体素边界框。八叉树体素围绕斯坦福兔子表面的每个3D点。红点代表点数据。这个图像是用octree_viewer创建的。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
分割
背景
的分割库包含用于分割点云成不同的集群算法。这些算法最适合处理由多个空间分离区域组成的点云。在这种情况下,聚类通常用于将云分解成其组成部分,然后可以独立处理。
在集群提取教程中可以找到解释聚类方法如何工作的理论入门。这两幅图说明了平面模型分割(左)和圆柱模型分割(右)的结果。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
样本共识
背景
该sample_consensus图书馆拿着样品共识(SAC)方法,如RANSAC和模型,如平面和圆柱。这些可以自由组合以检测点云中的特定模型及其参数。
在随机样本共识教程中可以找到一个解释样本共识算法如何工作的理论引言
在这个库中实现的一些模型包括:线条,平面,圆柱体和球体。平面配件经常被用于检测常见的室内表面,例如墙壁,地板和桌面。其他模型可用于检测和分割具有常见几何结构的物体(例如,将圆柱体模型安装到杯子上)。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
表面
背景
所述表面库涉及从3D扫描重构原始表面。根据目前的任务,这可以是例如船体,网格表示或具有法线的平滑/重新采样表面。
平滑和重采样可能是重要的,如果云是嘈杂的,或者如果它是由多个扫描不完美对齐。可以调整表面估计的复杂度,如果需要,可以在相同的步骤中估计法线。
网格划分是一种通用的方式来创建一个表面的点,目前有两种算法提供:一个非常快速的三角点的原始点,和一个较慢的网格平滑和填孔。
例如,当需要简化的表面表示或需要提取边界时,创建凸面或凹面船体是有用的。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
范围图像
背景
该range_image库包含了代表,并与一系列图像时两班。距离图像(或深度图)是其像素值表示距传感器原点的距离或深度的图像。距离图像是常见的3D表示,并且通常由立体或飞行时间相机生成。了解摄像机的固有校准参数后,可以将距离图像转换为点云。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
I / O
背景
该IO库包含用于读取和写入点云数据(PCD)的文件,以及从各种传感装置捕获点云的类和函数。有关这些功能的介绍可以在以下教程中找到:
PCD(点云数据)文件格式
从PCD文件读取PointCloud数据
将PointCloud数据写入PCD文件
PCL中的OpenNI采集卡框架
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
可视化
背景
该可视化图书馆建为能够快速原型和可视化的三维点云数据操作的算法结果的目的。与OpenCV 用于显示2D图像和在屏幕上绘制基本2D图形的highgui例程类似,该库提供:
渲染和设置任何nD点云数据集的视觉属性(颜色,点大小,不透明度等)的方法 pcl::PointCloud<T> format;
用于在屏幕上绘制基本3D形状的方法(例如圆柱,球体,线,多边形等),或者从一组点或者从参数方程中绘制;
用于2D图的直方图可视化模块(PCLHistogramVisualizer);
用于pcl :: PointCloud <T>
数据集的多种几何和颜色处理程序;
一个pcl::RangeImage
可视化模块。
该软件包利用VTK库进行距离图像和2D操作的3D渲染。
为了实现你自己的可视化器,看一下library附带的测试和例子。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/filters/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
共同
背景
所述公共库包含由多数PCL库中使用的共同的数据结构和方法。核心数据结构包括PointCloud类和许多用于表示点,曲面法线,RGB颜色值,特征描述符等的点类型。它还包含许多用于计算距离/规范,平均值和协方差,角度转换,几何变换等等。
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/common/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
搜索
背景
该搜索库提供了使用不同的数据结构,包括寻找最近的邻居方法:
KdTree
八叉树(Octree)
brute force
专门搜索有组织的数据集
位置:
Linux:
Header files(头文件): $(PCL_PREFIX)/pcl-1.6/pcl/search/
Binaries(二进制文件): $(PCL_PREFIX)/bin/
$(PCL_PREFIX) is the cmake installation prefix CMAKE_INSTALL_PREFIX, e.g., /usr/local/
二进制
本节为PCL中的一些常用工具提供了一个快速参考。
pcl_viewer
:可视化PCD(点云数据)文件的快速方法。有关PCD文件的更多信息可以在PCD文件格式教程中找到。
语法是:pcl_viewer <file_name 1..N>.<pcd or vtk> <options>
,其中选项是:
-bc r,g,b
=背景颜色
-fc r,g,b
=前景色
-ps X
=磅值(1…64)
-opaque X
=呈现点云不透明度(0…1)
-ax n
=允许屏幕显示XYZ轴并将它们缩放到n
-ax_pos X,Y,Z
=如果启用了轴,则在空间中设置它们的X,Y,Z位置(默认为0,0,0)
-cam (*)
=使用给定的相机设置作为初始视图
(*)
[剪切范围/焦点/位置/查看/距离/视野Y /窗口大小/窗口位置]或使用包含相同信息的<filename.cam>。
-multiview 0/1
=启用/禁用自动多视口渲染(默认禁用)
-normals 0/X
=禁用/启用每个X点的曲面法线的显示为线(默认禁用)-normals_scale X
=将正常单位矢量大小调整为X(默认为0.02)
-pc 0/X
=禁用/启用每个第X个点主曲线的显示为行(默认禁用)-pc_scale X
=将主曲率向量大小调整为X(默认为0.02)
(注意:对于多个.pcd
文件,提供多个{fc,ps,opaque}
参数;它们将自动分配给正确的文件)
用法示例:
pcl_viewer -multiview 1 data/partial_cup_model.pcd data/partial_cup_model.pcd data/partial_cup_model.pcd
以上将加载partial_cup_model.pcd
文件3次,并创建一个多视口渲染(-multiview 1
)
pcd_convert_NaN_nan
:将“NaN”值转换为“nan”值。(注意:从PCL版本1.0.1开始,NaN的字符串表示是“nan”。)
用法示例:
pcd_convert_NaN_nan input.pcd output.pcd
convert_pcd_ascii_binary
:将PCD(点云数据)文件从ASCII转换为二进制,反之亦然。
用法示例:
convert_pcd_ascii_binary <file_in.pcd> <file_out.pcd> 0/1/2 (ascii/binary/binary_compressed) [precision (ASCII)]
concatenate_points_pcd
:将两个或多个PCD(点云数据)文件的点连接成一个PCD文件。
用法示例:
concatenate_points_pcd <filename 1..N.pcd>
(注意:生成的PCD文件将是“output.pcd”)
pcd2vtk
:将PCD(点云数据)文件转换为VTK格式。
用法示例:
pcd2vtk input.pcd output.vtk
pcd2ply
:将PCD(点云数据)文件转换为PLY格式。
用法示例:
pcd2ply input.pcd output.ply
mesh2pcd
:使用光线追踪操作将CAD模型转换为PCD(点云数据)文件。
语法是:mesh2pcd input.{ply,obj} output.pcd <options>
,其中选项是:
-level X
= tesselated球体级别(默认值:2)
-resolution X
=角度增量的球体分辨率(默认值:100度)
-leaf_size X
= VoxelGrid的XYZ叶片大小 - 用于数据缩减(默认值:0.010000 m)
octree_viewer
:允许八叉树的可视化
语法是:octree_viewer <file_name.pcd> <八叉树分辨率>
用法示例:
Example: ./octree_viewer …/…/test/bunny.pcd 0.02
PCL Walkthrough