单目初始化中的特征匹配
Frame::GetFeaturesInArea
函数
1. 函数目标
该函数的核心目的是在给定的图像帧 (Frame
) 中,高效地查找满足以下条件的特征点:
- 位于以指定点
(x, y)
为圆心、r
为半径的圆形区域内。 - 其所在的图像金字塔层级 (
octave
) 在指定的[minLevel, maxLevel]
范围内(可选)。
这在特征匹配、局部地图跟踪等场景中非常常用,需要在某个预期位置附近搜索对应的特征点。
2. 面临的挑战与常规思路
如果图像中有大量特征点(例如上千个),最直观的方法是:
- 遍历当前帧中的所有特征点。
- 对每一个特征点,计算它到圆心
(x, y)
的距离。 - 判断距离是否小于
r
,并且层级是否符合要求。
缺点: 计算量巨大,需要对所有点进行距离计算,对于实时性要求高的 SLAM 系统来说效率太低。
3. ORB-SLAM2 的优化策略:网格化加速 (Grid-based Acceleration)
为了解决效率问题,ORB-SLAM2 采用了空间划分的思想,具体为网格化:
- 预处理:在提取特征点后,系统会根据每个特征点的坐标,将其分配到预先划分好的二维网格 (
mGrid
) 中。每个网格单元存储落入其中的特征点的索引列表。 GetFeaturesInArea
的执行逻辑:- 确定相关网格 (Coarse Filtering):
- 根据输入的圆心
(x, y)
和半径r
,计算出这个圆形区域可能覆盖到的网格单元的最小/最大行号和列号 (nMinCellX
到nMaxCellX
,nMinCellY
到nMaxCellY
)。 - 目的:快速确定一个包含搜索圆的矩形网格区域,将搜索范围从整个图像缩小到少数几个网格单元。
- 根据输入的圆心
- 遍历候选特征点:
- 只遍历上一步确定的相关网格单元。
- 获取这些网格单元中包含的所有特征点索引。这些点是“候选点”。
- 目的:大大减少需要进一步检查的特征点数量。
- 精确筛选 (Fine Filtering):
- 对每一个候选点执行精确检查:
- 层级检查:
kpUn.octave
是否在[minLevel, maxLevel]
之间。 - 距离检查:计算该点到圆心
(x, y)
的精确距离,判断是否< r
(通常用距离平方< r*r
来避免开方运算)。
- 层级检查:
- 目的:从候选点中精确找出真正符合圆形区域和层级要求的点。
- 对每一个候选点执行精确检查:
- 返回结果:收集所有通过精确筛选的特征点的索引。
- 确定相关网格 (Coarse Filtering):
4. 核心思想总结:为何需要“网格+距离判断”?
- 网格是矩形的,搜索区是圆形的:网格能快速定位到包含搜索圆的矩形区域内的候选点,但这个矩形区域比圆形区域要大。
- 网格提供粗筛:它能高效排除大量无关的点,提供一个较小的候选集。
- 距离判断提供精筛:对于网格筛选出的候选点,必须进行精确的距离计算,才能判断它们是否真正位于圆形区域内部,排除那些在矩形网格内但在圆形区域外的点。
结论: GetFeaturesInArea
通过网格进行快速粗筛,然后对少量候选点进行精确的距离和层级判断,实现了在保证准确性的前提下,大幅提升邻域特征点搜索效率的目标。这是一种典型的空间换时间优化策略。