向量的叉积, 反对称矩阵
在射影几何中,一条直线有两点确定,
l
′
=
e
′
×
x
′
l^{'}= e^{'} \times x^{'}
l′=e′×x′设两个向量
a
⃗
\vec{a}
a,
b
⃗
\vec{b}
b,则这两个的向量叉积任然是一个向量,并且垂直于这两个向量所在的平面。用坐标表示如下:
a
⃗
×
b
⃗
=
[
0
−
z
1
y
1
z
1
0
−
y
x
x
1
0
]
[
x
2
y
2
z
2
]
=
(
a
⃗
×
)
⋅
b
⃗
\vec{a} \times \vec{b} = \begin{bmatrix} 0 & -z_1 & y_1 \\ z_1& 0 & \\ -y_x& x_1 & 0 \end{bmatrix}\begin{bmatrix} x_2\\ y_2\\ z_2 \end{bmatrix} = (\vec{a}{\times})\cdot \vec{b}
a×b=⎣⎡0z1−yx−z10x1y10⎦⎤⎣⎡x2y2z2⎦⎤=(a×)⋅b
其中
a
⃗
×
\vec{a}{\times}
a×称为向量
a
⃗
\vec{a}
a的反对称矩阵,向量叉积可以用矩阵乘法表示
基础矩阵F的推导
设第一个相机作为坐标系, 三维空间中的一点
P
=
[
X
,
Y
,
Z
]
P=[X, Y, Z]
P=[X,Y,Z], 其中在两个相机的像点分别为
p
1
,
p
2
p_1, p_2
p1,p2。由于第一个相机的中心作为世界坐标系的原点, 第二个相机平移
t
t
t, 旋转
R
R
R,则有
p
1
=
K
1
∗
P
p_1 = K_1*P
p1=K1∗P
公式1 K 1 K1 K1 为相机内参
p 2 = K 2 ( R P + t ) p_2 = K_2(RP + t) p2=K2(RP+t)
公式2 K 2 K_2 K2为相机内参
由于
p
1
=
K
1
P
p_1 = K_1P
p1=K1P 可以得到
P
=
K
1
−
1
p
1
P = K_1^{-1}p_1
P=K1−1p1 将其带入公式2中得到:
p
2
=
K
2
(
R
K
1
−
1
p
1
)
p_2 = K_2(RK_1^{-1}p_1)
p2=K2(RK1−1p1)
同时两边左乘
K
2
−
1
K_2^{-1}
K2−1得到
K
2
−
1
p
2
=
K
2
−
1
∗
K
2
(
R
∗
K
1
−
1
p
1
+
t
)
K_2^{-1}p_2 = K_2^{-1}*K_2(R*K_1^{-1}p1 + t)
K2−1p2=K2−1∗K2(R∗K1−1p1+t)
公式3 可以另 K 2 − 1 p 2 = x 2 K_2^{-1}p2 = x_2 K2−1p2=x2, K 1 − 1 ∗ p 1 = x 1 K_1^{-1}*p1 = x1 K1−1∗p1=x1且 K ∗ K − 1 = I K*K^{-1} = I K∗K−1=I
所以公式3可以写作:
x
2
=
R
∗
x
1
+
t
x_2 = R*x_1 + t
x2=R∗x1+t
公式4 两边同时左乘以t的反对称矩阵 t × t\times t× ,由于 t × t = 0 t\times t = 0 t×t=0
公式4可以改写为:
t
×
x
2
=
t
×
R
x
1
t\times x_2 = t\times R x_1
t×x2=t×Rx1
再同左乘以
x
2
T
x_2^T
x2T
x
2
T
t
×
x
2
=
x
2
T
t
×
R
x
1
x_2^Tt\times x_2 = x_2^Tt\times Rx_1
x2Tt×x2=x2Tt×Rx1
由于
t
×
x
2
t\times x_2
t×x2是向量
t
t
t和向量
x
2
x_2
x2的叉积, 同时垂直于向量
t
t
t和向量
x
2
x_2
x2,所以上式左边等于0 得到:
x
2
T
t
×
R
x
1
=
0
x_2^Tt\times Rx_1 = 0
x2Tt×Rx1=0
公式5, E = t × R E = t\times R E=t×R为本质矩阵, 其和基础矩阵相差相机的内参K, 将其带入可得基础矩阵
p
2
T
K
2
T
t
×
R
K
1
−
1
p
1
=
0
p2^TK_2^Tt \times RK_1^{-1}p1 = 0
p2TK2Tt×RK1−1p1=0
p
2
T
F
p
1
=
0
p_2^T F p_1 = 0
p2TFp1=0
其中基础矩阵
K
2
T
t
×
R
K
1
−
1
K_2^Tt \times RK_1^{-1}
K2Tt×RK1−1
估计基础矩阵
通过匹配点对估算基础矩阵
基础矩阵F是一个
3
×
3
3 \times3
3×3矩阵, 有9个未知数,然而公式中使用齐次坐标,齐次坐标在相差一个常数因子下是相等的,所以F有8个未知数, 也就是只需8对匹配点就可以解出基础矩阵,
假设一对匹配像点
p
1
=
[
u
1
,
v
1
,
1
]
p_1 = [u_1, v_1, 1]
p1=[u1,v1,1] ,
p
2
=
[
u
2
,
v
2
,
1
]
p_2 =[u_2, v_2, 1]
p2=[u2,v2,1]带入式中得到:
[
u
1
,
v
1
,
1
]
[
f
1
f
2
f
3
f
4
f
5
f
6
f
7
f
8
f
9
]
[
u
2
v
2
1
]
=
0
[u_1, v_1, 1] \begin{bmatrix} f_1 & f_2 &f_3 \\ f_4& f_5 &f_6 \\ f_7& f_8 &f_9 \end{bmatrix}\begin{bmatrix} u_2\\ v_2\\ 1 \end{bmatrix} = 0
[u1,v1,1]⎣⎡f1f4f7f2f5f8f3f6f9⎦⎤⎣⎡u2v21⎦⎤=0
将基础矩阵当作一个向量
f
=
[
f
1
,
f
2
,
f
3
,
f
4
,
f
5
,
f
6
,
f
7
,
f
8
]
f=[f_1, f_2, f_3, f_4, f_5,f_6,f_7,f_8]
f=[f1,f2,f3,f4,f5,f6,f7,f8]处理可以将上式变形为:
[
u
1
u
2
,
u
1
u
2
,
u
1
,
v
1
u
2
,
v
1
v
2
,
v
1
,
u
2
,
v
2
,
1
]
f
=
0
[u_1u_2, u_1u_2, u_1, v_1u_2, v_1v_2, v_1, u_2,v_2,1]f=0
[u1u2,u1u2,u1,v1u2,v1v2,v1,u2,v2,1]f=0
求解上面的方程组就可以得到基础矩阵各个元素了。当然这只是理想中的情况,由于噪声、数值的舍入误差和错误的匹配点的影响,仅仅求解上面的线性方程组得到的基础矩阵非常的不稳定,因此在8点法的基础上有各种改进方法。
图像坐标归一化 Normalizing transformation
将上面公式中由匹配的点对坐标组成的矩阵记为系数矩阵
A
f
=
0
Af=0
Af=0
void Initializer::Normalize(const vector<cv::KeyPoint> &vKeys, vector<cv::Point2f> &vNormalizedPoints, cv::Mat &T)
{
float meanX = 0;
float meanY = 0;
const int N = vKeys.size();
vNormalizedPoints.resize(N);
for(int i=0; i<N; i++)
{
meanX += vKeys[i].pt.x;
meanY += vKeys[i].pt.y;
}
meanX = meanX/N;
meanY = meanY/N;
float meanDevX = 0;
float meanDevY = 0;
for(int i=0; i<N; i++)
{
vNormalizedPoints[i].x = vKeys[i].pt.x - meanX;
vNormalizedPoints[i].y = vKeys[i].pt.y - meanY;
meanDevX += abs(vNormalizedPoints[i].x);
meanDevY += abs(vNormalizedPoints[i].y);
}
meanDevX = meanDevX/N;
meanDevY = meanDevY/N;
float sX = 1.0/meanDevX;
float sY = 1.0/meanDevY;
for(int i=0; i<N; i++)
{
vNormalizedPoints[i].x = vNormalizedPoints[i].x * sX;
vNormalizedPoints[i].y = vNormalizedPoints[i].y * sY;
}
T = cv::Mat::eye(3,3,CV_32F);
T.at<float>(0,0) = sX;
T.at<float>(1,1) = sY;
T.at<float>(0,2) = -meanX*sX;
T.at<float>(1,2) = -meanY*sY;
}
这样,首先对原始的图像坐标进行归一化处理,再利用8点法求解基础矩阵,最后将求得的结果解除归一化,得到基础矩阵F F,总结如下:
- 对图像1进行归一化处理,计算一个只包含平移和缩放的变换 H 1 H_1 H1, 将图像1中的匹配点集归一化
- 对图像2,计算变换矩阵 H 2 H_2 H2进行相同的归一化处理
- 使用8点法利用变换后的点集估计基础矩阵 F ^ \hat{F} F^
- 根据变换 F = H 2 T F ^ H 1 F = H_2^T\hat{F}H_1 F=H2TF^H1
最小二乘化
仅仅对图像坐标进行归一化处理,能在一定程度上提高计算的精度,但在实践中还是不够的。8点法中,只使用8对匹配的点对估计基础矩阵,但通常两幅图像的匹配的点对远远多于8对,可以利用更多匹配的点对来求解上面的方程。由于基础矩阵
F
F
F在一个常量因子下是等价的,这样可以给基础矩阵
F
F
F的元素组成的向量
f
f
f施加一个约束条件
∥
f
∥
=
1
\begin{Vmatrix} f \end{Vmatrix} = 1
∥∥f∥∥=1
这样由
K
⩾
8
K\geqslant 8
K⩾8个匹配点对组合成一个矩阵
Q
K
×
9
Q_{K\times9}
QK×9,求解上面方程就变成求解如下问题的最小二乘解:
m
i
n
∣
∣
f
∣
∣
=
1
∣
∣
Q
f
∣
∣
2
\underset{||f||=1}{min}||Qf||^2
∣∣f∣∣=1min∣∣Qf∣∣2
其中矩阵Q的每一行来自一对匹配点;
f
f
f是基础矩阵
F
F
F元素组成的待求解的向量,根据2范数定义
∣
∣
Q
f
∣
∣
2
=
(
Q
f
)
T
(
Q
f
)
=
f
T
(
Q
T
Q
)
f
||Qf||^2 = (Qf)^T(Qf) = f^T(Q^TQ)f
∣∣Qf∣∣2=(Qf)T(Qf)=fT(QTQ)f
将上式中间部分提出来得到矩阵
M
=
Q
T
Q
M =Q^TQ
M=QTQ这是一个9,9矩阵,基于拉格朗日-欧拉乘数优化定理,在
∣
∣
f
∣
∣
=
1
||f||=1
∣∣f∣∣=1约束下
Q
f
=
0
Qf=0
Qf=0的最小二乘解为矩阵
M
=
Q
T
Q
M=Q^TQ
M=QTQ的最小特征向量,所以对矩阵
Q
Q
Q进行奇异值分解(SVD)
Q
=
U
Σ
V
t
Q = U\Sigma V^t
Q=UΣVt
Q
Q
Q是
K
×
9
K \times 9
K×9的矩阵,
U
U
U是
K
×
K
K \times K
K×K的正交矩阵, KaTeX parse error: Expected 'EOF', got '\SigmaS' at position 1: \̲S̲i̲g̲m̲a̲S̲ ̲是K \times 9$的矩阵,
V
T
V^T
VT是
9
×
9
9 \times 9
9×9的正交矩阵, 每一个列向量对应着
Σ
\Sigma
Σ的奇异值,所以最小二乘解就是
V
T
V^T
VT的第9列向量也就是可由
f
=
V
9
f=V_9
f=V9构造基础矩阵
F
F
F。基础矩阵
F
F
F还有一个重要性质, 为其秩为2
R
a
n
k
(
F
)
=
2
Rank(F) = 2
Rank(F)=2列向量
V
9
V_9
V9构造的基础矩阵 秩通常不为2,需要进一步优化,在估计基础矩阵时,设其最小奇异值为0, 对上面的方法取得的基础矩阵进行SVD分解
F
=
S
V
D
=
S
[
v
1
0
0
0
v
2
0
0
0
v
3
]
D
F = SVD = S\begin{bmatrix} v_1 & 0 &0 \\ 0& v_2 &0 \\ 0& 0 &v_3 \end{bmatrix}D
F=SVD=S⎣⎡v1000v2000v3⎦⎤D
其最小特征值
v
3
v_3
v3设为0 从而使得
F
F
F的秩为2,这样得到
F
=
S
V
D
=
S
[
v
1
0
0
0
v
2
0
0
0
0
]
D
F = SVD = S\begin{bmatrix} v_1 & 0 &0 \\ 0& v_2 &0 \\ 0& 0 &0 \end{bmatrix}D
F=SVD=S⎣⎡v1000v20000⎦⎤D
对上述进行总结
- 对两幅图像的匹配点进行归一化转换矩阵 H 1 , H 2 H_1, H_2 H1,H2
- 有对应的点构造矩阵 Q Q Q
- 对矩阵 Q Q Q进行SVD分解, Q = U Σ V T Q = U\Sigma V^T Q=UΣVT,由向量 f = V 9 f=V_9 f=V9构造矩阵 F ^ \hat{F} F^
- 对得到的基础矩阵进行秩为2约束,即得其SVD分解,另 v 3 = 0 v_3=0 v3=0再重构得到基础矩阵 F ′ F^{'} F′
- 对上一步得到的基础矩阵反归一化,得到基础矩阵 F = H 2 T F ′ H 1 F = H_2^TF^{'}H_1 F=H2TF′H1