背景

表面法线和曲率估计是对某个点周围的几何特征的基本表示。虽计算速度快容易,但却无法获得太多信息,因为它们只使用很少的几个参数值来近似某个点的k-邻域特征。然而大多数场景会包含许多具有相同或非常相似的特征值的点,若采用点特征表示法将直接减少了它们的全局特征信息。

理论基础

PFH计算方式通过参数化查询点与领域点之间的空间差异,并形成一个多维直方图对点的k领域几何属性进行描述。直方图所在的高维超空间为特征表示提供了一个可度量的信息空间,对点云对应曲面的6维姿态具有不变性,并在不同的采集密度或领域的噪声下具有鲁棒性。PFH表示法是基于点和其k领域之间的关系以及它们的估计法线,简而言之,它考虑估计法线方向之间的所有相互作用,试图捕获最好的样本表面情况从而描述样本的几何特征。因此,合成特征空间取决于每一个点的表面法线估计的质量。

如图所示,表示的是一个查询点() 的PFH计算的影响区域, 用红色标注并放在圆球的中间位置,半径为r, ()的所有k邻元素(即与点的距离小于半径r的所有点)全部互相连接在一个网络中。最终的PFH描述子通过计算邻域内所有两点之间关系而得到的直方图,因此存在一个O(k) 的计算复杂性。

为了计算两点Pi和Pj及与它们对应的法线Ni和Nj之间的相对偏差,在其中的一个点上定义一个固定的局部坐标系,如下图所示。

使用上图中uvw坐标系,法线ns和nt之间的偏差可以用一组角度来表示,如下所示:

d是两点之间的欧氏距离。计算k邻域内的每一对点的四组值,这样就把两点和它们法线相关的12个参数(xyz坐标值和法线信息)减少到4个。

为查询点创建最终的PFH表示,所有的四元组将会以某种统计的方式放进直方图中,这个过程首先把每个特征值范围划分为b个子区间,并统计落在每个子区间的点数目,因为四分之三的特征在上述中为法线之间的角度计量,在三角化圆上可以将它们的参数值非常容易地归一到相同的区间内。一个统计的例子是:把每个特征区间划分成等分的相同数目,为此在一个完全关联的空间内创建有 个区间的直方图。在这个空间中,一个直方图中某一区间统计个数的增一对应一个点的四个特征值。如图3所示,就是点云中不同点的点特征直方图表示法的一个例子,在某些情况下,第四个特征量d在通常由机器人捕获的2.5维数据集中的并不重要,因为临近点间的距离从视点开始是递增的,而并非不变的,在扫描中局部点密度影响特征时,实践证明省略d是有益的。

点特征直方图(PFH)在PCL中的实现是pcl_features模块的一部分。默认PFH的实现使用5个区间分类(例如:四个特征值中的每个都使用5个区间来统计)。

PFHEstimation类的实际计算程序内部只执行以下步骤:

对点云P中的每个点p

1.得到p点的最近邻元素

2.对于邻域内的每对点,计算其三个角度特征参数值

3.将所有结果统计到一个输出直方图中

代码展示

#include<iostream>
#include<vector>
#include <pcl/point_types.h>
#include <pcl/features/pfh.h>
#include <pcl/io/pcd_io.h>//点云文件pcd 读写
#include <pcl/features/normal_3d.h>//法线特征
#include <pcl/visualization/pcl_plotter.h>// 直方图的可视化 方法2using namespace std;
int main()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);//======【1】 读取点云文件 填充点云对象======pcl::PCDReader reader;reader.read("ism_test_cat.pcd", *cloud_ptr);// =====【2】计算法线========创建法线估计类====================================pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;ne.setInputCloud(cloud_ptr);pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());ne.setSearchMethod(tree);//设置近邻搜索算法// 输出点云 带有法线描述pcl::PointCloud<pcl::Normal>::Ptr cloud_normals_ptr(new pcl::PointCloud<pcl::Normal>);pcl::PointCloud<pcl::Normal>& cloud_normals = *cloud_normals_ptr;// Use all neighbors in a sphere of radius 3mne.setRadiusSearch(3);//半价内搜索临近点 3m// 计算表面法线特征ne.compute(cloud_normals);//=======【3】创建PFH估计对象pfh,并将输入点云数据集cloud和法线normals传递给它=================pcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::PFHSignature125> pfh;// phf特征估计其器pfh.setInputCloud(cloud_ptr);pfh.setInputNormals(cloud_normals_ptr);//如果点云是类型为PointNormal,则执行pfh.setInputNormals (cloud);//创建一个空的kd树表示法,并把它传递给PFH估计对象。//基于已给的输入数据集,建立kdtreepcl::search::KdTree<pcl::PointXYZ>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZ>());//pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr tree2 (new pcl::KdTreeFLANN<pcl::PointXYZ> ()); //-- older call for PCL 1.5-pfh.setSearchMethod(tree2);//设置近邻搜索算法//输出数据集pcl::PointCloud<pcl::PFHSignature125>::Ptr pfh_fe_ptr(new pcl::PointCloud<pcl::PFHSignature125>());//phf特征//使用半径在5米范围内的所有邻元素。//注意:此处使用的半径必须要大于估计表面法线时使用的半径!!!pfh.setRadiusSearch(5);//计算pfh特征值pfh.compute(*pfh_fe_ptr);cout << "phf feature size : " << pfh_fe_ptr->points.size() << endl;// 应该与input cloud->points.size ()有相同的大小,即每个点都有一个pfh特征向量// ========直方图可视化=============================pcl::visualization::PCLPlotter plotter;plotter.addFeatureHistogram(*pfh_fe_ptr, 300); //设置的很坐标长度,该值越大,则显示的越细致plotter.plot();return 0;
}

效果展示

点云文件下载:ism_train_cat.pcd

PCL之点特征直方图(PFH)相关推荐

  1. pcl里面的点特征直方图(PFH)

    表面法线和曲率可以好的代表一个点的几何特征.然而它们算得很快,而且算法简单,但是它们不能捕获细节,它们只是点的近邻的几何特征的近似估计.作为一个直接的结论,大多数的场景往往会包括很多有着相似特征的点, ...

  2. pcl点云特征提取 法线估计 PFH FPFH NARF 惯量偏心矩 RoPs特征 视点特征直方图VFH GASD特征

    pcl点云特征提取 法线估计 PFH FPFH NARF 惯量偏心矩  RoPs特征  视点特征直方图VFH GASD特征 博文末尾支持二维码赞赏哦 _ 如果要对一个三维点云进行描述,光有点云的位置是 ...

  3. 【PCL自学:Feature3】PFH点特征直方图的概念和使用 (持续更新)

    一.点特征直方图(PFH)描述子介绍   Point Feature Histograms (PFH) 称为点特征直方图.   随着点特征的研究不断深入,利用点周围的邻近点估计表面法向和曲率的基本操作 ...

  4. PCL 点云特征描述与提取

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:开着拖拉机唱山歌 链接:https://zhuanlan.zhihu.com/p/1032192 ...

  5. PCL提取3D点云模型特征(3.0 FPFH快速点特征直方图)附完整代码

    一.概述 上一篇博客解释了PFH是什么以及如何利用PFH来提取点云的特征,那么讲了PFH(PCL提取3D点云模型特征(2.0 PFH点特征直方图 )附完整代码)之后肯定是要接着说FPFH的.本来想着把 ...

  6. 点特征直方图(PFH)描述(Point Feature Histograms (PFH) descriptors)

    #点特征直方图(PFH)描述符 随着点特征表示的进行,曲面法线和曲率估计在它们围绕特定点的几何图形的表示中是相当基本的.虽然计算起来非常快速和容易,但它们不能捕获太多的细节,因为它们只能用几个值来逼近 ...

  7. 【PCL自学:Feature5】视点特征直方图VFH概念及使用 (持续更新)

    一.视点特征直方图(VFH)原理   这篇博文描述了视点特征直方图(Viewpoint Feature Histogram[VFH])描述符,在一些其他文章也称为视角特征直方图,这是一种用于聚类识别和 ...

  8. PCL:PCLPlotter可视化特征直方图

    PCLPlotter提供了一个直接简单的绘图接口,可以绘制许多类型的二维图形,包括多项式函数和特征直方图,比如PFH,FPFH等. 利用PCLPlotter绘制图形,通常分为以下4步: (1)声明绘图 ...

  9. PCL点云特征描述与提取(3)

    快速点特征直方图(FPFH)描述子 已知点云P中有n个点,那么它的点特征直方图(PFH)的理论计算复杂度是,其中k是点云P中每个点p计算特征向量时考虑的邻域数量.对于实时应用或接近实时应用中,密集点云 ...

最新文章

  1. 线上直播丨Hinton等6位图灵奖得主、百余位顶级学者邀你群聊AI
  2. 提交调用验证_干货丨RPA验证码识别技巧
  3. java.lang.String_自己写的java.lang.String可以让jvm加载到吗?
  4. java.lang.NoClassDefFoundError: com/android/build/gradle/internal/ToolingRegistryProvider
  5. Change handler table ESH_EX_CPOINTER
  6. CPU 可以跑多快?地球到火星的距离告诉你!
  7. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(上传安装包并解压_05)
  8. uni map 实时记录轨迹_北斗GPS汽车行车记录仪,部标808商用轿车专用
  9. android json字符串转成json对象_【hive】解析JSON格式字符串
  10. 研究生如何写好毕业论文?(上)【中国人民大学龚新奇】
  11. 目标跟踪数据集VOT环境详细配置过程(附部分tracker融合代码)
  12. 全国软考——软件评测师有感
  13. mysql修改变量立即生效_mysql变量修改及生效
  14. CSS学习笔记——动画进阶(八音盒动画效果)
  15. 阿里云产品有哪些?阿里云产品种类整理汇总
  16. html如何制作展开全文,如何实现文章内容页点击“展开阅读全文”的功能
  17. touchGFX 添加中文字库
  18. LCD2864 T 串行通信 STM32 MSP430 单片机 显示屏 显示测试程序
  19. c语言remainder函数,【总结】C/C++取余操作:%、fmod()、remainder()的区别和联系
  20. php计算用户留存,利用Python计算新增用户留存率

热门文章

  1. HDU 1133 Buy the Ticket
  2. 使用泛型, 写一个为任意类型的动态数组添加元素的方法
  3. WCF热带鱼书学习手记 - ABC
  4. ELK官方文档:在Kibana加密通讯
  5. yum [Errno 256] No more mirrors to try 解决方法
  6. windows10更新后网络无法连接的问题
  7. Django-djangorestframework-异常模块-源码及自定义异常
  8. 移动端压缩并ajax上传图片解决方案
  9. coc部落冲突关联错误101解决方案
  10. html2canvas+jspdf 完美解决html导出且分页 解决图片显示不全问题