对极约束 基础矩阵

向量的叉积, 反对称矩阵

在射影几何中,一条直线有两点确定, 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 =0z1yxz10x1y10x2y2z2=(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=K1P

公式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=K11p1 将其带入公式2中得到:
p 2 = K 2 ( R K 1 − 1 p 1 ) p_2 = K_2(RK_1^{-1}p_1) p2=K2(RK11p1)
同时两边左乘 K 2 − 1 K_2^{-1} K21得到
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) K21p2=K21K2(RK11p1+t)

公式3 可以另 K 2 − 1 p 2 = x 2 K_2^{-1}p2 = x_2 K21p2=x2, K 1 − 1 ∗ p 1 = x 1 K_1^{-1}*p1 = x1 K11p1=x1 K ∗ K − 1 = I K*K^{-1} = I KK1=I

所以公式3可以写作:
x 2 = R ∗ x 1 + t x_2 = R*x_1 + t x2=Rx1+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×RK11p1=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×RK11

估计基础矩阵

通过匹配点对估算基础矩阵

基础矩阵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]f1f4f7f2f5f8f3f6f9u2v21=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 K8个匹配点对组合成一个矩阵 Q K × 9 Q_{K\times9} QK×9,求解上面方程就变成求解如下问题的最小二乘解:
m i n ∣ ∣ f ∣ ∣ = 1 ∣ ∣ Q f ∣ ∣ 2 \underset{||f||=1}{min}||Qf||^2 f=1minQf2
其中矩阵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 Qf2=(Qf)T(Qf)=fT(QTQ)f
将上式中间部分提出来得到矩阵 M = Q T Q M =Q^TQ M=这是一个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 &amp; 0 &amp;0 \\ 0&amp; v_2 &amp;0 \\ 0&amp; 0 &amp;v_3 \end{bmatrix}D F=SVD=Sv1000v2000v3D
其最小特征值 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 &amp; 0 &amp;0 \\ 0&amp; v_2 &amp;0 \\ 0&amp; 0 &amp;0 \end{bmatrix}D F=SVD=Sv1000v20000D
对上述进行总结

  • 对两幅图像的匹配点进行归一化转换矩阵 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^{&#x27;} F
  • 对上一步得到的基础矩阵反归一化,得到基础矩阵 F = H 2 T F ′ H 1 F = H_2^TF^{&#x27;}H_1 F=H2TFH1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值