Motion的结构:从Essential矩阵计算旋转和平移矩阵时出错

时间:2015-07-04 10:31:11

标签: opencv computer-vision camera-calibration structure-from-motion

我试图模拟运动中的结构。

  1. 考虑运动在x方向的情况。我创建了下面给出的匹配点,其中仅在x方向上有50像素的移动。
  2. 上一张图片协调

     [0] {x=50.000 y=50.00 }   [1] {x=100.00 y=50.00 }
     [2] {x=150.00 y=50.00 }   [3] {x=200.00 y=50.00 }  
     [4] {x=250.00 y=50.00 }   [5] {x=300.00 y=50.00 }  
     [6] {x=50.000 y=100.0 }   [7] {x=100.00 y=100.0 }  
     [8] {x=150.00 y=100.0 }   [9] {x=200.00 y=100.0 }  
    [10] {x=250.00 y=100.0 }  [11] {x=300.00 y=100.0 }  
    [12] {x=50.000 y=150.0 }  [13] {x=100.00 y=150.0 }  
    [14] {x=150.00 y=150.0 }  [15] {x=200.00 y=150.0 }  
    

    当前图片协调      [0] {x = 100.0 y = 50.0} [1] {x = 150.0 y = 50.0}
         [2] {x = 200.0 y = 50.0} [3] {x = 250.0 y = 50.0}      [4] {x = 300.0 y = 50.0} [5] {x = 350.0 y = 50.0}      [6] {x = 100.0 y = 100。 {7] {x = 150.0 y = 100。 }      [8] {x = 200.0 y = 100。 {9] {x = 250.0 y = 100。 }     [10] {x = 300.0 y = 100。 {11] {x = 350.0 y = 100。 }
        [12] {x = 100.0 y = 150。 {13] {x = 150.0 y = 150。 }     [14] {x = 200.0 y = 150。 {15] {x = 250.0 y = 150。 }

    内在矩阵     6.2821272 + 002 0. 3.474665e + 002     0. 6.2886809e + 002 2.4486120e + 002     0. 0。1。 使用已知的内在矩阵,我使用opencv函数(cvFindFundamentalMatrix

    计算基本矩阵
    int fm_count = cvFindFundamentalMat( pMatPtsImgPrev, pMatPtsImgCurr, 
            pFundMat,CV_FM_RANSAC ,0.2,0.99, status);
    

    平均像素误差非常接近零。

    然后使用下面给出的公式找到必要的矩阵

    E = CameraMatrix^T * F * CameraMatrix.
    

    具有X偏移的基本矩阵 -6.227048e-030,1.8018814e-014,4.30140591e-015 3.1235024e-014,2.7432764e-015,7.02982759 9.885755751e-015,-7.0298275,3.10862446e-015

    然后使用SVD分解下面链接中给出的旋转和平移矩阵 - SVD decomp = SVD(E);

    Extract Translation and Rotation from Fundamental Matrix

    分解旋转角度Rx = 0deg Ry = 0deg且Rz = 0deg。

    这似乎很好,因为旋转是0或180度。

    当坐标改变时,y方向的平移仅作为下面给出的坐标

    以前的坐标

     [0] {x=50.00 y=50.00 }  [1] {x=100.0 y=50.00 }
     [2] {x=150.0 y=50.00 }   [3] {x=200.0 y=50.00 }
     [4] {x=250.0 y=50.00 }  [5] {x=300.0 y=50.00 }
     [6] {x=50.00 y=100.0 }  [7] {x=100.0 y=100.0 }
     [8] {x=150.0 y=100.0 }  [9] {x=200.0 y=100.0 }   
    [10] {x=250.0 y=100.0 } [11] {x=300.0 y=100.0 }
    [12] {x=50.00 y=150.0 } [13] {x=100.0 y=150.0 }
    [14] {x=150.0 y=150.0 } [15] {x=200.0 y=150.0 }
    

    目前的坐标

     [0] {x=50.00 y=100.0 }  [1] {x=100.0 y=100.0 }
     [2] {x=150.0 y=100.0 }  [3] {x=200.0 y=100.0 }
     [4] {x=250.0 y=100.0 }  [5] {x=300.0 y=100.0 }
     [6] {x=50.00 y=150.0 }  [7] {x=100.0 y=150.0 }
     [8] {x=150.0 y=150.0 }  [9] {x=200.0 y=150.0 }
    [10] {x=250.0 y=150.0 } [11] {x=300.0 y=150.0 }
    [12] {x=50.00 y=200.0 } [13] {x=100.0 y=200.0 }
    [14] {x=150.0 y=200.0 } [15] {x=200.0 y=200.0 } 
    

    使用相同的程序和相同的内在矩阵构建基本矩阵和基本矩阵。

    具有Y偏移的基本矩阵     -2.791314e-030,2.5449611e-015,5.095796479e-016
        4.3544169e-015,-0.039722588,0.99921074 ] 1.78226326e-015,-0.999210746,-0.03972258

    但旋转分解为Rx = -2.27653561deg Ry = 180,Rz = 0

    我不理解的是,由于翻译在X和y方向,Rx有一些价值,我觉得旋转应该是0或180deg。

    恩迪给我一些提示,以便在我的代码中出现任何问题。

0 个答案:

没有答案