一. PCL中的特征点提取原则
1. 3D 特征,是基于局部描述子提取的。
3D feature,就是为了区分不同的表面几何特征而提取的特征值和测度值。
局部描述子,用于表现局部点所代表的表面几何特征。好的点特征描述子通常具备下面的特征:
1)转换不变性,也就是旋转、平移不会影响到特征向量的描述;
2) 采样密度变化不变性,即不同采样频率下的特征矢量基本一致;
3)噪声不变性,即,数据中不同噪声含量条件下不会影响到特征向量的相似性。
2. PCL的各种特征提取方法,都十分相似。只是在点选择和其邻域设置时可以进行不同设置
其中使用kd-tree的快速搜索方式。它也分为两种类型的搜索:
1)k个邻域点值的确定;
2)在半径为r的球半径内进行邻域搜索与计算。
3. PCL 如何选择哪部分点云数据被有来进行特征点的提取
1) 整个点云数据集为对象的过程,使用 setInputCloud。这时,每个点都被估计一个特征。
2) 可以取部分点云数据,通过setInputCloud 和 setIndices。这时,只有被分配了index的点才会被估计一个特征值。
3) 对于邻域的选择,可以用setSearchSurface设定。
4)于是,上述的三个函数:setInputCloud, setIndices, setSearchSurface组合后,就可以出现以下四种情况:

a) setIndices() =false, setSearchSurface()=false
此时,对点云中所有的点都进行特征统计。即,分别对每一点进行最邻近域的搜索与计算。
b) setIndices() =true, setSearchSurface()=false
只对有特定index的进行测算,其它的点不考虑,例如:只考虑p1点;而a图中的p2点因为没有index所以忽略;
c) setIndices() =false, setSearchSurface()=true
此时,所有的input点云中的点都要被作为被询问点;但是每个点的最近邻域要受限于Surface的定义,而不是全部的输入点云都要被作为最近邻域进行考虑。
d) setIndices() =true, setSearchSurface()=true
此时,输入点云中被询问的点和要搜索的邻域,分别受限于这两个函数的定义。
举例:
- 如果有一个点密度很高的点云数据,我们并不想对其中所有的点都进行特征估计,而是只希望对其中的key points 进行估计;或者是只考虑下采样后的点云的点的情况。
- 此时,只需要将key points 或者下采样的点云放入setInputCloud()函数中,将setSearchSurface()中放入原始数据就可以了。
二. PFH (Point Feature Histograms) 描述子
1. PFH描述子是基于XYZ的点云数据和表面法向量进行计算获得的。
PFH是通过局部特征的计算,再利用直方图统计出选定点云的全局特征的方法。
PFH是在一个目标点的k邻域内对它的几何特征进行编码。编码时,基于相关数值的多维直方图,提取围绕该点的平均曲率值。如下图所示,Pq是目标点,其周围的Pki即是选取的k邻域点。

n表示法线方向;Ps 和Pt是目标点与它的一个邻域点;
目标点与其邻域内选定的各点之间的法向量的差异,可以用三个角度特征进行描述: