[PCL] 点特征直方图(PFH)描述子

随着点特征表示的发展,表面法线和曲率估计在一定程度上是围绕特定点的几何表示的基础。虽然计算速度极快,也很容易,但是它们不能捕获太多的细节,因为它们只能用很少的值来近似点的k-邻域的几何形状。直接的结果是,大多数场景会包含许多具有相同或非常相似的特征值的点,从而减少了它们的信息特征。

PFH公式的目标是对点的k邻域几何特性进行编码,方法是使用一个多维值直方图来概括点周围的平均曲率。这种高维超空间为特征表示提供了一个信息签名,它不受底层表面的6D位姿的影响,并且能够很好地处理邻域中存在的不同采样密度或噪声。

点特征直方图表示是基于k邻域内的点与其估计的表面法线之间的关系。简单地说,它试图通过考虑估计法线方向之间的所有相互作用来尽可能最好地捕获采样的表面变化。由此产生的超空间依赖于各点表面法向估计的质量。

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

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

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

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

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

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

#include <pcl/point_types.h>                  //点类型头文件
#include <pcl/features/pfh.h>                 //pfh特征估计类头文件

...//其他相关操作
pcl::PointCloud<pcl::PointXYZ>::Ptrcloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::Normal>::Ptrnormals(new pcl::PointCloud<pcl::Normal>());
...//打开点云文件估计法线等

//创建PFH估计对象pfh,并将输入点云数据集cloud和法线normals传递给它pcl::PFHEstimation<pcl::PointXYZ,pcl::Normal,pcl::PFHSignature125> pfh;
pfh.setInputCloud(cloud);
pfh.setInputNormals(normals);//如果点云是类型为PointNormal,则执行pfh.setInputNormals (cloud);//创建一个空的kd树表示法,并把它传递给PFH估计对象。
//基于已给的输入数据集,建立kdtree
pcl::KdTreeFLANN<pcl::PointXYZ>::Ptrtree(new pcl::KdTreeFLANN<pcl::PointXYZ>());
pfh.setSearchMethod(tree);//输出数据集pcl::PointCloud<pcl::PFHSignature125>::Ptrpfhs(new pcl::PointCloud<pcl::PFHSignature125>());//使用半径在5厘米范围内的所有邻元素。

//注意:此处使用的半径必须要大于估计表面法线时使用的半径!!!
pfh.setRadiusSearch(0.05);//计算pfh特征值
pfh.compute(*pfhs);
// pfhs->points.size ()应该与input cloud->points.size ()有相同的大小,即每个点都有一个pfh特征向量

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

对点云P中的每个点p

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值