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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖: