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

相关文章

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安