1.极限约束与本征矩阵
设世界坐标系中有一点
p
p
p ,坐标为
X
X
X,它在左相机的图像坐标系为
x
1
′
x'_1
x1′像素坐标系为
x
1
x_1
x1,在右相机中的图像坐标系为
x
1
′
x'_1
x1′则
x
=
K
x
′
x=Kx'
x=Kx′其中
K
K
K为相机的内参矩阵,如图1(图中的
x
1
x_1
x1图像坐标系下的坐标,和公式的不同)设
p
p
p到两个相机光心垂直距离分别为
s
1
s_1
s1和
s
2
s_2
s2,且两个相机有相同的内参矩阵
K
K
K ,世界坐标系到两个相机坐标系的变换关系为
[
R
1
,
T
1
]
[R_1,T_1]
[R1,T1]和
[
R
2
,
T
2
]
[R_2,T_2]
[R2,T2] ,根据相机成像原理我们可以得到下面两个等式:
s
1
x
1
=
K
(
R
1
X
+
T
1
)
s_1x_1=K(R_1X+T_1)
s1x1=K(R1X+T1)
s
2
x
2
=
K
(
R
2
X
+
T
2
)
s_2x_2=K(R_2X+T_2)
s2x2=K(R2X+T2)
由于
K
K
K是可逆的得到
s
1
x
1
′
=
R
1
X
+
T
1
s_1x'_1=R_1X+T_1
s1x1′=R1X+T1
s
2
x
2
′
=
R
2
X
+
T
2
s_2x'_2=R_2X+T_2
s2x2′=R2X+T2设世界坐标系的原点为相机1的相机坐标系则有
s
1
x
1
′
=
X
s_1x'_1=X
s1x1′=X
s
2
x
2
′
=
R
2
X
+
T
2
s_2x'_2=R_2X+T_2
s2x2′=R2X+T2
公式1带入公式2得到:
s
2
x
2
′
=
s
1
R
2
x
1
′
+
T
2
s_2x'_2=s_1R_2x'_1+T_2
s2x2′=s1R2x1′+T2
对上式两边同时叉乘
T
2
T_2
T2 (叉乘方向为右手系垂直方向,大小为向量组成的平行四边形面积,向量叉乘自身为0)得到:
s
2
T
2
^
x
2
′
=
s
1
T
2
^
R
2
x
1
′
s_2\widehat{T_2}x'_2=s_1\widehat{T_2}R_2x'_1
s2T2
x2′=s1T2
R2x1′
然后上式与
x
2
′
x'_2
x2′做内积得到(
T
2
^
x
2
′
\widehat{T_2}x'_2
T2
x2′方向垂直与
x
2
′
x'_2
x2′):
0
=
x
2
′
T
2
^
R
2
x
1
′
0=x'_2\widehat{T_2}R_2x'_1
0=x2′T2
R2x1′
其中
E
=
T
2
^
R
E=\widehat{T_2}R
E=T2
R 由上式可以看出空间中的同一点在两个相机的图象坐标系满足的关系,和空间中的坐标点以及点到相机的距离都没有关系。上式也被称为极线约束,
E
E
E被称为本征矩阵。
然后通过5点法或者8点法求解 ,通过SVD求解
R
R
R,
T
T
T 。通过SVD求解的
R
R
R ,
T
T
T 没有正负性需要正则化,所以尺度无法确定。
2. 三角化
求解到
R
R
R,
T
T
T 后,由前面公式得到
s
2
x
2
′
=
R
2
X
+
T
2
s_2x'_2=R_2X+T_2
s2x2′=R2X+T2 ,公式中未知元素为
x
2
x_2
x2,
x
x
x 两边对
x
2
′
x'_2
x2′ 做叉积消除
s
2
s_2
s2 得:
x
2
′
^
R
2
X
=
−
x
2
′
^
T
2
\widehat{x'_2}R_2X=-\widehat{x'_2}T_2
x2′
R2X=−x2′
T2化为其次方程得:
x
2
^
[
R
2
,
T
2
]
[
X
,
1
]
T
=
0
\widehat{x_2}[R_2,T_2][X,1]^T=0
x2
[R2,T2][X,1]T=0然后用SVD分解法求解
X
X
X左侧0空间再把最后一个元素归一化到1求得
x
x
x 然后把
R
,
T
R,T
R,T开始的两个公式求得真实世界
X
X
X。
这里实现了一个python版本的demo:sfm_python