Harris3D 角点检测算法的原理和算法流程
一、核心思想:从 2D 到 3D 的延伸
Harris3D 的思想完全源于其 2D 版本。在 2D 图像中,一个点是否是“角点”取决于其在一个小窗口(邻域) 内各个方向移动时,图像灰度(强度) 的变化情况。
-
平坦区域:无论向哪个方向移动窗口,灰度变化都不大。
-
边缘区域:沿着边缘方向移动,灰度变化不大;垂直于边缘方向移动,灰度变化剧烈。
-
角点区域:向任何方向移动窗口,灰度变化都非常剧烈。
在 3D 点云中,我们没有“灰度”的概念。因此,Harris3D 的核心创新在于用什么来替代“灰度”。最常用的替代者是表面法向量。法向量可以很好地描述局部表面的几何特征(方向)。
所以,在 3D 中,判断一个点是否是“角点”就变成了:评估其在一个球形邻域内各个方向移动时,表面法线方向的变化情况。
二、算法原理与流程
第1步:输入与预处理
- 输入:原始 3D 点云 Cloud。
- 必需预处理:计算点云中每个点的法线。这是 Harris3D 算法的基石。通常使用 pcl::NormalEstimation 来完成,它通过PCA分析点邻域内的协方差矩阵来估算法线。
第2步:为每个点构建协方差矩阵
对于点云中的每一个待检测点 ppp,执行以下操作:
-
1.确定搜索邻域: 以点 ppp 为中心,选择一个半径为 rrr 的球形邻域,找到所有在球内的邻近点 pip_ipi 及其对应的法向量 nin_ini。
(在PCL实现中,通常使用K近邻搜索,但思想是类似的)。 -
2.计算协方差矩阵: 构建一个反映邻域内法线变化的 3x3 协方差矩阵 MMM。这个矩阵的核心是计算法线在各个坐标轴方向上的变化关系。
矩阵 MMM 的计算公式通常为:
其中:
-
NNN 是邻域内点的数量。
-
nin_ini