【译】PCL官网教程翻译(17):快速点特征直方图(FPFH)描述符 -Fast Point Feature Histograms (FPFH) descriptors

本文主要是介绍【译】PCL官网教程翻译(17):快速点特征直方图(FPFH)描述符 -Fast Point Feature Histograms (FPFH) descriptors,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

英文原文阅读

快速点特征直方图(FPFH)描述符

计算复杂度直方图(见点特征直方图(PFH)描述符)对于一个给定的有 n n n个点的点云 P P P O ( n k 2 ) O (nk ^ 2) O(nk2), k k k是每个点P的最邻近点个数。对于要求实时或接近实时的应用程序,密集点的特征直方图的计算效率是一个一个主要问题。
本教程描述了PFH公式的简化,称为快速点特征直方图(FPFH)(更多信息请参阅Rusu论文),它将算法的计算复杂度降低到O(nk),同时仍然保留了PFH的大部分识别能力。

理论基础

为了简化直方图特征的计算,我们进行如下操作:

  • 在第一步中,对于每个查询点 p q p_q pq,按照点特征直方图(PFH)描述符中描述的方式计算它自己和它的邻居之间的一组元组 &lt; α 、 ϕ 、 θ &gt; &lt;\alpha、\phi、\theta&gt; <αϕθ>——这将称为简化点特征直方图(SPFH);
  • 第二步,对每个点重新确定其k个邻点,利用相邻的SPFH值对 p q p_q pq的最终直方图(称为FPFH)进行加权,如下图所示:
    F P F H ( p q ) = S P F H ( p q ) + 1 k ∑ i = 1 k 1 w k ⋅ S P F H ( ω k ) FPFH(p_q) = SPFH(p_q) + \frac{1}{k}\sum_{i=1}^k\frac{1}{w_k}\cdot SPFH(\omega_k) FPFH(pq)=SPFH(pq)+k1i=1kwk1SPFH(ωk)

其中权值 ω k \omega_k ωk表示查询点 p q p_q pq与某个给定度量空间中的相邻点 p k p_k pk之间的距离,从而为( p q p_q pq, p k p_k pk)对打分,但如果需要,也可以选择不同的度量。为了理解该权重方案的重要性,下图给出了以 p q p_q pq为中心的k邻域集的影响区域图。
在这里插入图片描述
因此,对于给定的查询点 p q p_q pq,算法首先通过在它自己和它的邻居之间创建对来估计它的SPFH值(用红线表示)。这将对数据集中的所有点重复执行,然后使用 p k p_k pk邻近点的SPFH值对 p q p_q pq的SPFH值重新加权,从而为 p q p_q pq创建FPFH。额外的FPFH连接,由于额外的加权方案的结果,用黑色线显示。如图所示,一些值对将被计数两次(图中用较粗的线标记)。

PFH和FPFH的区别

PFH和FPFH理论的主要区别如下:
1、从图中可以看出,FPFH并没有完全互连 p q p_q pq的所有邻居,因此缺少了一些可能有助于捕获查询点周围几何形状的值对;
2、PFH对查询点周围精确确定的曲面进行建模,而FPFH在r半径球之外包含额外的点对(最多2r远);
3、由于采用了重权方案,FPFH将SPFH值组合在一起,并重新获得了一些点邻近值对;
4、大大降低了FPFH的总体复杂度,使其能够在实时应用中使用;
5、通过去关联这些值,可以简化生成的直方图,即简单地创建 d d d个单独的特征直方图(每个特征维一个),并将它们连接在一起(见下图)。
在这里插入图片描述

估计FPFH特性

快速点特征直方图作为pcl_features库的一部分在PCL中实现。
默认的FPFH实现使用11个子分区(例如,四个特征值中的每一个都将从它的值间隔中使用这么多的bin),以及一个去相关的方案(见上面:特征直方图分别计算并赋值),结果是一个33字节的浮点值数组。它们存储在pcl::FPFHSignature33 点类型中。
下面的代码片段将为输入数据集中的所有点估计一组FPFH特性。

#include <pcl/point_types.h>
#include <pcl/features/fpfh.h>{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal> ());... read, pass in or create a point cloud with normals ...... (note: you can create a single PointCloud<PointNormal> if you want) ...// 创建FPFH估计类,并将输入数据集+法线传递给它pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh;fpfh.setInputCloud (cloud);fpfh.setInputNormals (normals);//或者,如果cloud是tpe PointNormal,则执行fpfh.setInputNormals(cloud);// 创建一个空的kdtree表示,并将其传递给FPFH估计对象。// 它的内容将根据给定的输入数据集填充到对象中(因为没有其他搜索表面)。pcl::search::KdTree<PointXYZ>::Ptr tree (new pcl::search::KdTree<PointXYZ>);fpfh.setSearchMethod (tree);// 输出数据集pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs (new pcl::PointCloud<pcl::FPFHSignature33> ());// 使用半径为5cm的球体中的所有邻居// 重点:这里使用的半径必须大于用于估计表面法线的半径!!fpfh.setRadiusSearch (0.05);// 计算特征fpfh.compute (*fpfhs);// fpfhs->points.size () 和 cloud->points.size ()一样
}

fpfhestimate类的实际计算调用在内部做了以下事情:

对于云中的每一点p
1. 第一步1. 获取 ' p '的最近邻点2. 对于每一对: p, $p_k$ '(其中' $p_k$ '是 ' p '的邻居,计算三个角值3.将所有结果放入一个输出SPFH直方图中
2. 第二步1. 获取' p '的最近邻点2.使用每个' p '的SPFH 与一个加权方案组合成 ' p '的FPFH:

注意
由于效率的原因,PFHEstimation中的计算方法不检查法线是否包含NaN或无穷大值。将这些值传递给compute()将导致未定义的输出。建议至少在设计加工链或设置参数时检查法线。这可以通过在调用compute()之前插入以下代码来实现:

for (int i = 0; i < normals->points.size(); i++)
{if (!pcl::isFinite<pcl::Normal>(normals->points[i])){PCL_WARN("normals[%d] is not finite\n", i);}
}

在编译代码中,应设置预处理步骤和参数,使法线是有限的或产生错误。

使用OpenMP加速FPFH

对于速度敏感的用户,PCL提供了FPFH估计的额外实现,它使用使用OpenMP的多核/多线程范例来加速计算。类的名称是pcl::FPFHEstimationOMP,它的API与单线程pcl:: fpfhestimate 100%兼容,这使得它适合作为drop-in替换。在一个有8个内核的系统上,您应该可以获得6-8倍的计算速度。

这篇关于【译】PCL官网教程翻译(17):快速点特征直方图(FPFH)描述符 -Fast Point Feature Histograms (FPFH) descriptors的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126979

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑