归一化8点算法
基本矩阵是由下述方程定义:
x
′
T
F
x
=
0
\mathbf x'^TF\mathbf x=\mathbf0
x′TFx=0
其中
x
↔
x
′
x↔x′
x↔x′是两幅图像的任意一对匹配点。由于每一组点的匹配提供了计算FF系数的一个线性方程,当给定至少
7
7
7个点(
3
×
3
3×3
3×3的齐次矩阵减去一个尺度,以及一个秩为
2
2
2的约束),方程就可以计算出未知的
F
F
F。我们记点的坐标为
x
=
(
x
,
y
,
1
)
T
,
x
′
=
(
x
′
,
y
′
,
1
)
T
x=(x,y,1)^T,x′=(x′,y′,1)^T
x=(x,y,1)T,x′=(x′,y′,1)T,则对应的方程为
[
x
y
1
]
[
f
11
f
12
f
13
f
21
f
22
f
23
f
31
f
32
f
33
]
[
x
′
y
′
1
]
=
0
\begin{bmatrix}x&y&1\end{bmatrix} \begin{bmatrix} f_{11}&f_{12}&f_{13}\\ f_{21}&f_{22}&f_{23}\\ f_{31}&f_{32}&f_{33} \end{bmatrix} \begin{bmatrix}x'\\ y'\\1\end{bmatrix}=0
[xy1]⎣⎡f11f21f31f12f22f32f13f23f33⎦⎤⎣⎡x′y′1⎦⎤=0
展开后有
x
′
x
f
11
+
x
′
y
f
12
+
x
′
f
13
+
y
′
x
f
21
+
y
′
y
f
22
+
y
′
f
23
+
x
f
31
+
y
f
32
+
f
33
=
0
x'xf_{11}+x'yf_{12}+x'f_{13}+y'xf_{21}+y'yf_{22}+y'f_{23}+xf_{31}+yf_{32}+f_{33}=0
x′xf11+x′yf12+x′f13+y′xf21+y′yf22+y′f23+xf31+yf32+f33=0
把矩阵
F
F
F写成列向量的形式,则有:
[
x
′
x
x
′
y
x
′
y
′
x
y
′
y
y
′
x
y
1
]
f
=
0
\begin{bmatrix}x'x&x'y&x'&y'x&y'y&y'&x&y&1\end{bmatrix}\mathbf f=0
[x′xx′yx′y′xy′yy′xy1]f=0
给定
n
n
n组点的集合,我们有如下方程:
A
f
=
[
x
1
′
x
1
x
1
′
y
1
x
1
′
y
1
′
x
1
y
1
′
y
1
y
1
′
x
1
y
1
1
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
x
n
′
x
n
x
n
′
y
n
x
n
′
y
n
′
x
n
y
n
′
y
n
y
n
′
x
n
y
n
1
]
f
=
0
A\mathbf f=\begin{bmatrix} x_1'x_1&x_1'y_1&x_1'&y_1'x_1&y_1'y_1&y_1'&x_1&y_1&1\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ x_n'x_n&x_n'y_n&x_n'&y_n'x_n&y_n'y_n&y_n'&x_n&y_n&1 \end{bmatrix}\mathbf f=\mathbf 0
Af=⎣⎢⎡x1′x1⋮xn′xnx1′y1⋮xn′ynx1′⋮xn′y1′x1⋮yn′xny1′y1⋮yn′yny1′⋮yn′x1⋮xny1⋮yn1⋮1⎦⎥⎤f=0
如果存在确定(非零)解,则系数矩阵 A A A的秩最多是 8 8 8。由于 F F F是齐次矩阵,所以如果矩阵 A A A的秩为 8 8 8,则在差一个尺度因子的情况下解是唯一的。可以直接用线性算法解得。
如果由于点坐标存在噪声则矩阵AA的秩可能大于 8 8 8(也就是等于 9 9 9,由于 A A A是 n × 9 n×9 n×9的矩阵)。这时候就需要求最小二乘解,这里就可以用SVD来求解, f f f的解就是系数矩阵 A A A最小奇异值对应的奇异向量,也就是 A A A奇异值分解后 A = U D V T A=UDV^T A=UDVT中矩阵 V V V的最后一列矢量,这是在解矢量ff在约束 ‖ f ‖ ‖f‖ ‖f‖下取 ‖ A f ‖ ‖Af‖ ‖Af‖最小的解。以上算法是解基本矩阵的基本方法,称为8点算法。
由于基本矩阵有一个重要的特点就是奇异性, F F F矩阵的秩是 2 2 2。如果基本矩阵是非奇异的,那么所计算的对极线将不重合。所以在上述算法解得基本矩阵后,会增加一个奇异性约束。最简便的方法就是修正上述算法中求得的矩阵FF。设最终的解为 F ′ F' F′,令 d e t F ′ = 0 detF'=0 detF′=0下求得Frobenius范数(二范数) ‖ F − F ′ ‖ ‖F−F'‖ ‖F−F′‖最小的 F ′ F' F′。这种方法的实现还是使用了SVD分解,若 F = U D V T F=UDV^T F=UDVT,此时的对角矩阵 D = d i a g ( r , s , t ) D=diag(r,s,t) D=diag(r,s,t),满足 r ≥ s ≥ t r≥s≥t r≥s≥t,则 F ′ = U d i a g ( r , s , 0 ) V T F'=Udiag(r,s,0)V^T F′=Udiag(r,s,0)VT最小化范数 ‖ F − F ′ ‖ ‖F−F'‖ ‖F−F′‖,也就是最终的解。
所以8点算法由下面两个步骤组成:
1.求线性解 由系数矩阵 A A A最小奇异值对应的奇异矢量 f f f求的FF。
2.奇异性约束 是最小化Frobenius范数 ‖ F − F ′ ‖ ‖F−F'‖ ‖F−F′‖的 F ′ F' F′代替 F F F。
8点算法是计算基本矩阵的最简单的方法。为了提高解的稳定性和精度,往往会对输入点集的坐标先进行归一化处理。在MVG的估计一章中推荐各向同性归一化,OpenCV的8点算法也是使用了各向同性,也就是使得各个点做平移缩放之后到坐标原点的均方根距离等于 2 \sqrt 2 2。非各向同性归一化和各向同性归一化在论文In Defense of the Eight-Point Algorithm中有讨论,ORB-SLAM2单目初始化F矩阵计算之前的归一化使用的是非各向同性归一化。对于归一化八点算法的总结如下:
给定 n ≥ 8 n≥8 n≥8组对应点 x i ↔ x i ′ {x_i↔x_i'} xi↔xi′,确定基本矩阵 F F F使得 x i ′ T F x i = 0 x_i'^TFx_i=0 xi′TFxi=0
算法:
1.归一化:根据 x ^ i = T x i , x ^ i ′ = T ′ x i ′ \hat x_i=Tx_i,\hat x'_i=T'x'_i x^i=Txi,x^i′=T′xi′,变换图像坐标。其中 T T T和 T ′ T' T′是有平移和缩放组成的归一化变换。、
2.求解对应匹配的基本矩阵 F ′ F^′ F′
1.求线性解:用由对应点集 x ^ i ↔ x ^ i ′ {\hat x_i↔\hat x_i'} x^i↔x^i′确定的系数矩阵 A ^ \hat A A^的最小奇异值的奇异矢量确定 F ^ \hat F F^。
2.奇异性约束:用SVD对 F ^ \hat F F^进行分解,令其最小奇异值为 0 0 0,得到 F ^ ′ \hat F' F^′,使得 d e t F ′ = 0 detF^′=0 detF′=0。
3.解除归一化:令 F = T ′ T F ^ ′ T F=T'^T\hat F'T F=T′TF^′T。矩阵 F F F就是数据 x i ↔ x i ′ x_i↔x'_i xi↔xi′对应的基本矩阵。
我是用了SIFT对两个图像进行特征提取以及匹配,然后使用归一化8点算法进行基本矩阵的求解,并且把两个视图的对极线都画出。下图为SIFT匹配图以及对极线:
由于两幅图像在匹配的时候有不少错误的匹配,所以计算的基本矩阵有较大的误差。看第二幅图,左右视图中都可以发现很多的点在对极线附近但并没有完全落在对极线上。我们可以观察到左右视图的对极线都响应地汇聚到一点,那点就是极点。这一对匹配中极点都落在图像内,当然也有些情况对极线会落在图像外,比如下图
具体的代码实现见Github
参考
转载自:
博主:kokerf
博文地址:https://blog.csdn.net/kokerf/article/details/72630863?locationNum=2&fps=1
来源:CSDN