PCL学习:点云特征-视点特征直方图(VFH)

视点特征直方图VFH(Viewpoint Feature Histogram)描述子,它是一种新的特征表示形式,应用在点云聚类识别和六自由度位姿估计问题。图1展示了VFH识别和位姿估计的一个例子。已知一组训练样本数据(除最左端的点云之外的首行,底行),学习了一个模型,然后使用一个点云(左下方)来查询/测试这个模型。从左下方开始,匹配结果从左到右是按照最好到最坏的顺序排列的。

PCL学习:点云特征-视点特征直方图(VFH)_第1张图片

图1 VFH识别和位姿估计示意图

理论基础

视点特征直方图(或VFH)是源于FPFH描述子(见Fast Point Feature Histograms (PFH) 描述子)。由于它的获取速度和识别力,我们决定利用FPFH强大的识别力,但是为了使构造的特征保持缩放不变性的性质同时,还要区分不同的位姿,计算时需要考虑加入视点变量。我们做了以下两种计算来构造特征,以应用于目标识别问题和位姿估计:1.扩展FPFH,使其利用整个点云对象来进行计算估计(如2图所示),在计算FPFH时以物体中心点与物体表面其他所有点之间的点对作为计算单元。2.添加视点方向与每个点估计法线之间额外的统计信息,为了达到这个目的,我们的关键想法是在FPFH计算中将视点方向变量直接融入到相对法线角计算当中。
PCL学习:点云特征-视点特征直方图(VFH)_第2张图片

图2 扩展的FPFH分量计算示意图

通过统计视点方向与每个法线之间角度的直方图来计算视点相关的特征分量。注意:并不是每条法线的视角,因为法线的视角在尺度变换下具有可变性,我们指的是平移视点到查询点后的视点方向和每条法线间的角度。第二组特征分量就是前面PFH中讲述的三个角度,如PFH小节所述,只是现在测量的是在中心点的视点方向和每条表面法线之间的角度,如图3所示。

图3 视点方向与法线之间分量计算示意图

因此新组合的特征被称为视点特征直方图(VFH)。下图表体现的就是新特征的想法,包含了以下两部分:

1.一个视点方向相关的分量

2.一个包含扩展FPFH的描述表面形状的分量

 

图4 VFH直方图

估计VFH特征值

视点特征直方图在PCL中的实现属于pcl_features模块库的一部分。对扩展的FPFH分量来说,默认的VFH的实现使用45个子区间进行统计,而对于视点分量要使用128个子区间进行统计,这样VFH就由一共308个浮点数组成阵列。在PCL中利用pcl::VFHSignature308点类型来存储表示。PFH/FPFH描述子和VFH之间的主要区别是:对于一个已知的点云数据集,只一个单一的VFH描述子,而合成的PFH/FPFH特征的数目和点云中的点数目相同。以下代码段将对输入数据集中的所有点估计一组VFH特征值。

#include                   //点类型头文件

#include                  //vfh特征估计类头文件


...//其他相关操作

  pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

  pcl::PointCloud::Ptr normals (new pcl::PointCloud ());

...//打开点云文件估计法线等

//创建VFH估计对象vfh,并把输入数据集cloud和法线normal传递给它

  pcl::VFHEstimation vfh;

  vfh.setInputCloud (cloud);

  vfh.setInputNormals (normals);

//如果点云是PointNormal类型,则执行vfh.setInputNormals (cloud);

//创建一个空的kd树对象,并把它传递给FPFH估计对象。

//基于已知的输入数据集,建立kdtree

pcl::KdTreeFLANN::Ptr tree (new pcl::KdTreeFLANN ());

  vfh.setSearchMethod (tree);

//输出数据集

  pcl::PointCloud::Ptr vfhs (new pcl::PointCloud ());

//计算特征值

  vfh.compute (*vfhs);

// vfhs->points.size ()的大小应该是1,即vfh描述子是针对全局的特征描述

 

你可能感兴趣的:(PCL,点云库PCL从入门到精通)