PCL 库概览

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

概述

PCL 被拆分为多个模块化库。主要模块如下图所示:

Filters 滤波器

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

Feature 特征

特征库包含从点云数据中进行三维特征估计的数据结构和机制。三维特征是空间某些三维点或位置的表示,它根据点周围的可用信息描述几何模式。在查询点周围选择的数据空间称为 k 邻域
下图为所选的查询点及其 k 邻域的示例:

最广泛使用的几何点特征例子是下垫面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​.

KeyPoints 关键点

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

Registration 配准

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

Kd-tree kd树

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

Octree 八叉树

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

Segmentation 分割

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

Sample Consensus 采样一致性

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

Surface 表面

表面库用于重构原始 3D 扫描的表面。这取决于具体任务,例如,这可以是船体,网格表示或光滑/重新采样的表面与法线。
如果点云是有噪声的,或者它是由多个没有完全对齐的扫描组成的,那么平滑和重新采样是很重要的。曲面估计的复杂度可以调整,如果需要,法线可以在同一步中估计。

网格划分是一种从点云中创建曲面的通用方法,目前有两种算法:一种是对原始点进行快速的三角划分,另一种是进行平滑和补孔的较慢的网格划分。

当需要简化表面表示或需要提取边界时,创建凸或凹外壳是有用的。

Range Image 距离图像

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

I/O 读写

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

Visualization 可视化

建立可视化库的目的是能够快速原型化和可视化算法在3D点云数据上的操作结果。类似于 OpenCV 的用于显示 2D 图像和在屏幕上绘制基本 2D 形状的 highgui 例程。
pcl::PointCloud<T> format 格式的 n 维点云数据集提供渲染和设置可视属性(颜色、点大小、不透明度等)的方法。

从点集或参数方程在屏幕上绘制基本3D形状(如圆柱体、球体、直线、多边形等)的方法;

用于2D图的直方图可视化模块 PCLHistogramVisualizer

pcl::PointCloud 数据集提供大量的几何和颜色处理程序;

Common 常用库

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

Search 搜索

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

Binaries 二进制文件

提供了 PCL 常用工具的快速参考。
pcl::viewer :一种快速预览 PCD 文件的方法。
语法规则: pcl_viewer <file_name 1..N>.<pcd or vtk> <options>
其中 <options> 选项有:
-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_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 <file_in.pcd> <file_out.pcd> 0/1/2 (ascii/binary/binary_compressed) [precision (ASCII)]

pcl_concatenate_points_pcd 将两个或多个PCD(点云数据)文件中的点连接到一个PCD文件中。
例子:
pcl_concatenate_points_pcd <filename 1..N.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 <options>
其中 <options> 选项有:
-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 <file_name.pcd> <octree resolution>
例子:
Example: ./pcl_octree_viewer ../../test/bunny.pcd 0.02


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

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

PCL库官方教程01相关推荐

  1. AI作曲基础-Python编程作曲软件篇-FoxDot文档及源码分析-官方教程01

    AI作曲基础-Python编程作曲软件篇-FoxDot文档及源码分析-官方教程01 前言 本系列系列目录放在文尾: 本系列是AI作曲的基础,暂时和AI关系不大,但尤为重要: 借助FoxDot,从文档分 ...

  2. REDM库使用教程01(详细入门)

    写这篇文章初衷在于,虽然开发这套框架的作者很叼,但是教程写的有点糟糕,坑了我一个晚上研究. REDM库的简单介绍 https://gitee.com/hgy413/REDM 然后要先装好VS2010; ...

  3. PCL学习笔记(二):PCL官方教程学习

    PCL学习笔记(二):PCL官方教程学习 PCD文件制作 Features 表面法线提取 Keypoints 提取NARF关键点 KdTree Range Image How to create a ...

  4. ROS下使用PCL库教程

    ros下使用PCL教程 ROS下使用PCL步骤 1. 创建工作空间 2. 创建ROS包 3. 创建代码ROS代码框架 4. 配置CMakeLists.txt文件 5. 从PCL教程中下载pcl处理代码 ...

  5. NodeJS 使用官方oracledb库连接数据库教程

    NodeJS 使用官方oracledb库连接数据库教程 导读 Linux下安装使用 gcc安装 nodejs安装 oracle客户端安装 npm安装oracledb测试连接 错误说明 windows下 ...

  6. 随笔:送给初次使用PCL库的小伙伴

    写在前面: PCL库,之前在使用他的时候,只是各种掉库,觉得自己会调库了,根据案例可以跑出来自己想要的结果(比如计算一个点云的边界,使用RANSAC拟合三维直线等)觉得自己就是掌握了,其实并不然,这样 ...

  7. Caffe官方教程翻译(8):Brewing Logistic Regression then Going Deeper

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  8. Caffe官方教程翻译(6):Learning LeNet

    前言 最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档.自己也做了一些标注,都用斜体标记出来了.中间可能额外还加了自己遇到的问题或是运行结果之类的.欢迎交流指正,拒绝喷子! ...

  9. React 全家桶入门教程 01

    React 全家桶入门教程 01 前面是基础课程(难度小,略过),后面是案例 目的 巩固react基础知识,查漏补缺(熟悉的部分快进) 学习相关的库的使用 https://study.163.com/ ...

最新文章

  1. open source ecg_苹果watchOS 7.1 正式版发布:ECG功能上线多国
  2. simple go web application 二维码生成 打包部署
  3. DIET:Dual Intent and Entity Transformer
  4. 微信小程序从入门到飞起(各个组件)
  5. Linux DNS服务配置与管理详解
  6. 8天玩转并行开发——第三天 plinq的使用
  7. 毕马威中国领先地产科技企业50
  8. 奇偶数判断(信息学奥赛一本通-T1041)
  9. 安卓学习笔记20:Fragment入门
  10. 大数据毕设/课设 - 基于大数据的客流量数据可视化平台
  11. DelphiIE插件开发
  12. 王之泰 201771010131《面向对象程序设计(java)》第十六周学习总结
  13. ubuntu 截图工具flameshot(火焰截图)
  14. 由于找不到C:\InetPub\ftproot\Tipray\Ldterm\ghijt32.DLL,无法继续执行代码。重新安装程序可能会解决此问题。
  15. python中 and 和 or 操作的返回值。
  16. 微型计算机cpu组成部分是,微型计算机的中央处理器CPU由()和()两部分组成。 - 问答库...
  17. Go官方包 - strings包
  18. 企业短信防火墙应用-爱侬「北京市家政服务龙头企业」
  19. Python性能测试工具汇总
  20. 使用ListIterator 对List遍历时修改,删除

热门文章

  1. 投资最重要的事读后感_《投资最重要的事》读后感1800字
  2. 分享一篇超全的 Vue 相关的资源,值得收藏!
  3. html 的函数写法,react中函数的不同写法的区别是什么?
  4. excel方差函数和均方差函数使用介绍
  5. matlab求四元数夹角,如何求出两个四元数之间的夹角?
  6. 小学妹听了都说棒的:国王试毒酒问题
  7. matlab 共振解调,Matlab.m 共振解调法诊断轴承损伤类故障的原理概述如下:当轴承某一元件表 联合开发网 - pudn.com...
  8. 解决Required XXX parameter ‘XXX‘ is not present问题
  9. 如何做一个基于微信高校食堂就餐预约小程序序系统毕业设计毕设作品
  10. HTML5知识点总结(五)