ORB-SLAM2学习笔记:ORBextractor的构造函数详解
ORBextractor的构造函数是ORB-SLAM2中特征提取模块的核心初始化部分,主要完成图像金字塔参数配置、特征点分配策略设定以及方向计算所需数据预计算。以下是对代码的逐部分解析:
一. 成员变量初始化
ORBextractor::ORBextractor(int _nfeatures, float _scaleFactor, int _nlevels, int _iniThFAST, int _minThFAST):nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(_nlevels),iniThFAST(_iniThFAST), minThFAST(_minThFAST)
- 参数说明 :
_nfeatures
:总特征点数(默认1000-2000)。_scaleFactor
:金字塔相邻层缩放因子(默认1.2)。_nlevels
:金字塔层数(默认8)。_iniThFAST
:初始FAST角点检测阈值(默认20)。_minThFAST
:若初始阈值未检测到角点,降低后的阈值(默认7)。
二. 图像金字塔参数计算
mvScaleFactor.resize(nlevels);
mvLevelSigma2.resize(nlevels);
mvScaleFactor[0] = 1.0f;
mvLevelSigma2[0] = 1.0f;
for(int i=1; i<nlevels; i++) {mvScaleFactor[i] = mvScaleFactor[i-1] * scaleFactor;mvLevelSigma2[i] = mvScaleFactor[i] * mvScaleFactor[i];
}
- 功能:计算每层金字塔的缩放因子及其平方。
- 第0层为原始图像(缩放因子1.0)。
- 第i层缩放因子为前一层乘以
scaleFactor
(例如,1.2的缩放因子对应图像尺寸缩小为 1 / 1.2 1/1.2 1/1.2倍)。 mvLevelSigma2
用于后续高斯模糊的方差计算。
这段代码用于构建图像金字塔的缩放因子及其平方值,是ORB特征提取器中实现尺度不变性的核心计算逻辑。以下是对代码的逐行解析及其设计原理的详细说明:
1. 容器初始化
mvScaleFactor.resize(nlevels);
mvLevelSigma2.resize(nlevels);
mvScaleFactor[0] = 1.0f;
mvLevelSigma2[0] = 1.0f;
- 功能:初始化两个向量
mvScaleFactor
(缩放因子)和mvLevelSigma2
(缩放因子平方),大小为金字塔层数nlevels
。第0层(原始图像)的缩放因子设为1.0。 - 意义:
mvScaleFactor
存储每层图像相对于原始图像的缩小比例,而mvLevelSigma2
用于后续高斯模糊的方差计算(高斯核方差与缩放因子平方成正比)。
2. 逐层计算缩放因子
for(int i=1; i<nlevels; i++) {mvScaleFactor[i] = mvScaleFactor[i-1] * scaleFactor;mvLevelSigma2[i] = mvScaleFactor[i] * mvScaleFactor[i];
}
- 运算逻辑:
- 缩放因子:第
i
层的缩放因子 = 第i-1
层缩放因子 ×scaleFactor
(例如scaleFactor=1.2
时,逐层缩小为原始尺寸的1/1.2、1/(1.2)^2等)。 - 方差计算:高斯模糊的方差与图像缩放因子的平方相关,即
σ² = (scaleFactor^i)²
,用于构建不同尺度的高斯核。
- 缩放因子:第
- 设计目的:
- 尺度空间构建:通过逐层缩小图像,检测不同尺度下的特征点,实现尺度不变性。
- 效率优化:预计算缩放因子避免重复运算,后续特征点坐标可通过逆缩放因子还原到原始图像坐标系。
3. 参数设计的深层原理
-
金字塔层数与缩放因子选择:
- 典型配置为
nlevels=8
,scaleFactor=1.2
,平衡计算效率与特征覆盖范围。 - 高层(低分辨率)图像覆盖更大视野,但细节减少,适合检测大尺度特征。
- 典型配置为
-
高斯模糊与尺度归一化:
- 每层图像生成后需进行高斯模糊,模糊程度由
mvLevelSigma2
控制,抑制高频噪声并模拟不同尺度下的特征响应。 - 高斯核尺寸通常取
6σ+1
(如σ²=2时,核大小为7×7)。
- 每层图像生成后需进行高斯模糊,模糊程度由
-
逆参数计算:
- 后续代码中会预计算
mvInvScaleFactor
和mvInvLevelSigma2
,用于将特征点坐标从金字塔层映射回原始图像坐标系。
- 后续代码中会预计算
4. 应用示例
假设scaleFactor=1.2
,nlevels=3
,则计算结果为:
层级 | mvScaleFactor | mvLevelSigma2 |
---|---|---|
0 | 1.0 | 1.0 |
1 | 1.2 | 1.44 |
2 | 1.44 | 2.0736 |
- 第1层图像大小为原始尺寸的
1/1.2
,高斯模糊方差为1.44; - 第2层进一步缩小为
1/1.44
,方差为2.0736。
5. 关联技术对比
- 图像Resize方法:ORB使用高斯模糊+下采样,而深度学习模型(如YOLO)可能采用双线性插值,需保持训练与推理的一致性。
- 多尺度特征融合:类似思想也见于CNN中的FPN(特征金字塔网络),通过融合不同层特征提升检测效果。
这段代码通过预计算尺度参数,为ORB特征提取的高效性和尺度不变性奠定了基础,是SLAM系统中特征匹配鲁棒性的关键保障。
三. 逆参数预计算
mvInvScaleFactor.resize(nlevels);
mvInvLevelSigma2.resize(nlevels);
for(int i=0; i<nlevels; i++) {mvInvScaleFactor[i] = 1.0f / mvScaleFactor[i];mvInvLevelSigma2[i] = 1.0f / mvLevelSigma2[i];
}
- 作用:预计算缩放因子和方差的倒数,避免运行时重复除法运算,提升效率。
这段代码是ORB特征提取器中用于预计算图像金字塔各层逆缩放因子和逆方差的实现,主要涉及mvInvScaleFactor
和mvInvLevelSigma2
两个向量的初始化。以下是逐行解析及其作用:
1. 容器初始化
mvInvScaleFactor.resize(nlevels);
mvInvLevelSigma2.resize(nlevels);
- 功能:调整两个向量的大小为金字塔层数
nlevels
,为后续存储逆参数预留空间。 - 意义:
mvInvScaleFactor
存储每层缩放因子的倒数(即1.0f/scaleFactor
),用于将特征点坐标从金字塔层映射回原始图像坐标系。mvInvLevelSigma2
存储每层缩放因子平方的倒数(即1.0f/(scaleFactor^2)
),用于高斯模糊核参数的反向计算。
2. 逐层计算逆参数
for(int i=