特征点数量分配计算时缩放因子开方原因

文章目录
  1. 1. 特征点数量分配计算时缩放因子开方原因

特征点数量分配计算时缩放因子开方原因

原始分配策略是根据图像金字塔每层图像的面积大小来决定特征点提取数量,故第 \(i\) 层图像应分配特征点数量为:

\(N_i=\frac{N(1-s^2)}{1-(s^2)^m}(s^2)^i\)

ORB-SLAM2实际实现时(代码如下),将系数 \(s^2\) 替换为开方后的 \(s\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//图片降采样缩放系数的倒数
float factor = 1.0f / scaleFactor;
//第0层图像应该分配的特征点数量
float nDesiredFeaturesPerScale =
nfeatures\*(1 - factor)/(1 - (float)pow((double)factor, (double)nlevels));

//用于在特征点个数分配的,特征点的累计计数清空
int sumFeatures = 0;
//开始逐层计算要分配的特征点个数,顶层图像除外(看循环后面)
for( int level = 0; level < nlevels-1; level++ )
{
//分配 cvRound : 返回个参数最接近的整数值
mnFeaturesPerLevel[level] = cvRound(nDesiredFeaturesPerScale);
//累计
sumFeatures += mnFeaturesPerLevel[level];
//乘系数
nDesiredFeaturesPerScale \*= factor;
}

\(s^2,s\) 两种情况的每层特征分配数量分别计算如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import math
N = 1000
S = 1/1.2
seq = [0,1,2,3,4,5,6,7]
SumF = 0 # F is s^2
SumK = 0 # K is s
for i in seq:
F = N\*(1-S\*S)\*math.pow(S\*S,i)/(1-math.pow(S\*S,8))
K = N\*(1-S)\*math.pow(S,i)/(1-math.pow(S,8))
SumF = SumF + F
SumK = SumK + K
print("F is %d ," % F,"K is %d ." % K ,end='\n')

print("SumF is %d "% SumF,end='\n')
print("SumK is %d "% SumK,end='\n')
#输出如下:
F is 323 , K is 217 .
F is 224 , K is 180 .
F is 155 , K is 150 .
F is 108 , K is 125 .
F is 75 , K is 104 .
F is 52 , K is 87 .
F is 36 , K is 72 .
F is 25 , K is 60 .
SumF is 1000
SumK is 1000

故猜测系数替换原因

\(s^2\) 替换为 \(s\) 后,“高层”金字塔图像分配的特征点数量较以往有所增加,从而每层金字塔图像分配的数量会更为“均匀”,避免“高层”金字塔图像的特征数量过少导致匹配效果不好。