【译】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中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

SpringCloud Stream 快速入门实例教程

《SpringCloudStream快速入门实例教程》本文介绍了SpringCloudStream(SCS)组件在分布式系统中的作用,以及如何集成到SpringBoot项目中,通过SCS,可... 目录1.SCS 组件的出现的背景和作用2.SCS 集成srping Boot项目3.Yml 配置4.Sprin

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2