目录
一、概述
1.1法线估计
1.2SPFH(Simplified Point Feature Histograms)计算
1.3FPFH计算
二、代码实现
2.1关键函数
2.2完整代码
三、实现效果
3.1原始点云
3.2计算数据
一、概述
FPFH(Fast Point Feature Histogram)特征是一种用于描述点云局部几何特征的描述子。它由Rusu等人在2009年提出,旨在高效地描述三维点云的局部几何特征,并用于点云配准、分类和分割等任务。
FPFH特征的计算过程分为三个主要步骤:法线估计、SPFH计算和FPFH计算。
1.1法线估计
在计算FPFH特征之前,首先需要估计点云中每个点的法线。这通常通过邻域搜索和PCA(主成分分析)方法来完成。
步骤:
- 对于点云中的每个点,确定一个邻域(例如,通过k近邻搜索或半径搜索)。
- 使用PCA方法计算邻域点的协方差矩阵,并获取其特征向量。特征值最小的特征向量对应的方向即为法线方向。
1.2SPFH(Simplified Point Feature Histograms)计算
SPFH特征是对点云中每个点及其邻域点的几何关系的描述,具体通过以下三个角度计算:
对于每个点 𝑝,通过计算它与每个邻域点 𝑞 的上述三个角度,可以构建一个三维的特征直方图,这就是SPFH特征。
1.3FPFH计算
FPFH特征通过组合点的SPFH特征及其邻域点的SPFH特征来进一步描述点云的局部几何特征。具体步骤如下:
- 对于点云中的每个点 𝑝,计算其SPFH特征。
- 对于点云中的每个点 𝑝,收集其邻域点的SPFH特征。
- 通过将点 𝑝 的SPFH特征与其邻域点的SPFH特征加权求和,计算点 𝑝 的FPFH特征。
二、代码实现
2.1关键函数
def compute_fpfh_feature(input, search_param):
input:输入的点云
search_param:KD树的近邻搜索方式
Returns:33xN的数组,33表示特征描述子,N用来表示计算FPFH的点的个数
2.2完整代码
import open3d as o3d
# -------------传入点云数据,计算FPFH------------
def fpfh_compute(pcd):
radius_normal = 0.01 # kdtree参数,用于估计法线的半径,
print(":: Estimate normal with search radius %.3f." % radius_normal)
pcd.estimate_normals(
o3d.geometry.KDTreeSearchParamHybrid(radius=radius_normal, max_nn=30))
# 估计法线的1个参数,使用混合型的kdtree,半径内取最多30个邻居
radius_feature = 0.02 # kdtree参数,用于估计FPFH特征的半径
print(":: Compute FPFH feature with search radius %.3f." % radius_feature)
pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(pcd,
o3d.geometry.KDTreeSearchParamHybrid(
radius=radius_feature,
max_nn=100)) # 计算FPFH特征,搜索方法kdtree
return pcd_fpfh # 返回FPFH特征
# ----------------读取点云数据--------------
source = o3d.io.read_point_cloud("hand.pcd")
# -----------------计算的FPFH---------------
source_fpfh = fpfh_compute(source)
print(source_fpfh)
三、实现效果
3.1原始点云
3.2计算数据
Estimate normal with search radius 0.010.
:: Compute FPFH feature with search radius 0.020.
Feature class with dimension = 33 and num = 327323
Access its data via data member.