PFH,FPFH的简单/粗浅理解

发布于:2022-12-06 ⋅ 阅读:(845) ⋅ 点赞:(0)

PFH(Point Feature Histograms点特征直方图) :是基于特征点(keypoint)与其邻域点的空间几何关系来编码的。

如图所示,对于一个查询点Pq,给定邻域半径r,那么在该参考点Pq的邻域空间内有5个点(Pk1,...Pk5)。那么对查询点Pq(query point)和邻域内的5个点(k-neighbors),总共6个点进行两两匹配,得到5*6/2=15个点对point pair

接下来针对每一个点对,进行1、构建点对坐标系。2、特征描述。3、特征编码三个步骤,获得查询点Pq局部特征。

1、构建点对局部坐标系(Pairwise Local coordinate)

对于每一组点对,例如Ps和Pt如下图,首先基于点Ps建立局部坐标系:(可以类似把u,v,w轴类似为X,Y,Z轴)。U,V,W的计算如右图:

2、特征描述

目的是获取这个点对(Ps和Pt)的法向量之间的关系。因此可以计算Pt和Ps的法线Nt和Ns之间的偏差,该偏差用\alpha , \phi, \Theta表示。分别代表:Pt的法向量Nt和V坐标轴的夹角;直线PtPs和U坐标轴的夹角;Pt的法向量Nt投影到UW平面的直线和U坐标轴的夹角。(从图像中可以清楚看出来)。两点距离用d表示。公式如右图:

3、特征编码

如2所示,我们直到每个点对可以获得四个特征描述,\alpha , \phi, \Theta,d。我们可以把每一个特征划分为n个区间,这样的话就是n^{4}维。\alpha , \phi, \Theta都是角度,可以归一化,d是距离。

 二、FPFH(Fast Point Feature Histograms快速点特征直方图 ):

原理类似于PFH,有一些不同

1、复杂度更低,忽略了d的特征描述,只有\alpha , \phi, \Theta三个特征,叫做SPFH(Simplified Point Feature Histograms)。

2、(PFH是对于查询点和邻域内的k个点共k+1个点进行两两配对求点对特征)修正了 k 邻域点对的统计方式,分为两部分:前部分是SPFH(Pq):即查询点Pq 与周围 k 个点组成的k个点对的特征,后面部分是...SPFH(Pk):即每个邻点与周围 k 个点组成的点对的特征,第二部分的统计量取加权平均,如下式:

其中,权重w_{i} 表示查询点Pq 与邻点 Pki的距离。

3、修正了特征的编码方式

PFH将一个特征划分为n个区间,总共四个维度的特征,表示为n*n*n*n,稀疏性很大。FPFH只有三个维度的特征(\alpha , \phi, \Theta),以MATLAB为例:将一个区间划分为11个区间,这样需要11*11*11个小格子来对应,为降低稀疏性,我们将这3个特征写在一行,那就是形如【[\alpha],[\phi],[\theta]】,又因为每个特征划分为11个区间,那么表示为11+11+11=33。

因此对于查询点Pq,其FPFH特征可以表示为1*33维的向量。

若总共有n个查询点,那么FPFH特征是n*33维的矩阵

三、FPFH的MATLAB官网代码【需要MATLAB版本高于2020a】

运行结果:1、点云图 2、特征直方图

1、直方图

代码:keyInds = [6565 10000];表示选择了编号为6565和10000的两个点作为查询点。可以修改点的编号和个数(修改个数的话需要相应的修改'Color',[255 0 0;0 0 255]);)

如图所示:第一章图片是点云图,标记了两个查询点,红色和蓝色(由于蓝色和本身颜色重合所以看不清晰,设置为绿色0 255 0就可以看出来了)

2、直方图,由于查询了两个点,所以有两个直方图,横坐标是33维的,三个特征\alpha , \phi, \Theta表示为【【11】,【11】,【11】】,因为每个特征划分为11个区间。纵坐标应该是落在该区间的个数。比如红色图为例:\alpha , \phi, \Theta分别在区间6,区间17和区间28的数量最多。(这里的理解不够严谨)

 

 

clc;
clear;
%--------------------------加载点云到工作空间-----------------------------
ptObj = pcread('teapot.ply');
%%下采样
ptCloudIn = pcdownsample(ptObj,'gridAverage',0.05);
%%提取特征描述子FPFH,features是 N × 33 ;N代表N个有效点,
keyInds = [6565 10000];
%keyInds = [1000 2000 3000];
features = extractFPFHFeatures(ptCloudIn,keyInds);
%%显示关键点云
ptKeyObj = pointCloud(ptCloudIn.Location(keyInds,:),'Color',[255 0 0;0 0 255]);
figure
pcshow(ptObj)
title('Selected Indices on Point Cloud')
hold on
pcshow(ptKeyObj,'MarkerSize',100)
hold off
%%在特征点点显示FPFH特征描述符N × 33 正实数值矩阵 
figure
ax1 = subplot(2,1,1);
bar(features(1,:),'FaceColor',[1 0 0])
title('FPFH Descriptors of Selected Indices')
ax2 = subplot(2,1,2);
bar(features(2,:),'FaceColor',[0 0 1])
linkaxes([ax1 ax2],'xy')

https://zhuanlan.zhihu.com/p/192343758


网站公告

今日签到

点亮在社区的每一天
去签到