【译】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

相关文章

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X