【问题标题】:Rotation and Translation from Essential Matrix incorrect基本矩阵的旋转和平移不正确
【发布时间】:2016-05-11 16:51:58
【问题描述】:

我目前有立体相机设置。我已经校准了两个摄像头,并拥有两个摄像头K1K2 的内在矩阵。

K1 = [2297.311,      0,       319.498;
      0,       2297.313,      239.499;
      0,             0,       1];

K2 = [2297.304,      0,       319.508;
      0,       2297.301,      239.514;
      0,             0,       1];

我还使用来自 OpenCV 的 findFundamentalMat() 确定了两个相机之间的基本矩阵 F。我已经使用一对对应点 x1x2(在像素坐标中)测试了对极约束,它非常接近 0

F = [5.672563368940768e-10, 6.265600996978877e-06, -0.00150188302445251;
     6.766518121363063e-06, 4.758206104804563e-08,  0.05516598334827842;
     -0.001627120880791009, -0.05934224611334332,   1];

x1 = 133,75    
x2 = 124.661,67.6607

transpose(x2)*F*x1 = -0.0020

F 我能够以E = K2'*F*K1 获得基本矩阵E。我使用 MATLAB SVD 函数分解 E 以获得 K2 相对于 K1 的 4 种旋转和平移可能性。

E = transpose(K2)*F*K1;
svd(E);

[U,S,V] = svd(E);

diag_110 = [1 0 0; 0 1 0; 0 0 0];
newE = U*diag_110*transpose(V);
[U,S,V] = svd(newE); //Perform second decompose to get S=diag(1,1,0)

W = [0 -1 0; 1 0 0; 0 0 1];

R1 = U*W*transpose(V);
R2 = U*transpose(W)*transpose(V);
t1 = U(:,3); //norm = 1
t2 = -U(:,3); //norm = 1

假设K1 用作我们进行所有测量的坐标系。因此,K1 的中心位于C1 = (0,0,0)。有了这个,应该可以应用正确的旋转R和平移t,这样C2 = R*(0,0,0)+t(即K2的中心是相对于K1的中心测量的)

现在假设使用我对应的对 x1x2。如果我知道我的两个相机中每个像素的长度,并且因为我知道内在矩阵的焦距,我应该能够为两个相机确定两个向量v1v2,它们在所见的同一点相交下面。

pixel_length = 7.4e-6; //in meters
focal_length = 17e-3;  //in meters

dx1 = (133-319.5)*pixel_length; //x-distance from principal point of 640*480 image
dy1 = (75-239.5) *pixel_length; //y-distance from principal point of 640*480 image
v1  = [dx1 dy1 focal_length] - (0,0,0); //vector found using camera center and corresponding image point on the image plane

dx2 = (124.661-319.5)*pixel_length; //same idea 
dy2 = (67.6607-239.5)*pixel_length; //same idea
v2  = R * ( [dx2 dy2 focal_length] - (0,0,0) ) + t; //apply R and t to measure v2 with respect to K1 frame

有了这个向量并且知道了参数形式的线方程,我们就可以将两条线等同起来进行三角剖分,并通过 MATLAB 中的左手除法函数求解两个标量 s 和 t 以求解方程组.

C1 + s*v1 = C2 + t*v2
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t

确定st 后,我们可以通过插入直线方程找到三角点。但是,我的过程并不成功,因为我找不到单个 Rt 解决方案,其中点位于两个摄像头的前面并且两个摄像头都指向前方。

我的管道或思维过程有问题吗?是否有可能获得每个单独的像素射线?

【问题讨论】:

    标签: matlab opencv matlab-cvst triangulation stereo-3d


    【解决方案1】:

    当您将基本矩阵分解为 Rt 时,您会得到 4 种不同的解决方案。其中三个投影了一个或两个摄像头后面的点,其中一个是正确的。您必须通过对一些样本点进行三角测量来测试哪个是正确的。

    在 MATLAB 的计算机视觉系统工具箱中有一个名为 cameraPose 的函数,它会为您完成这项工作。

    【讨论】:

      【解决方案2】:

      应该不是C1-C2 = transpose([v2 -v1] * transpose([t s])。这行得通。

      【讨论】:

        【解决方案3】:

        检查了你的代码,发现R1和R2的行列式都是-1,这是不正确的,因为作为旋转矩阵,R的行列式应该等于1。只需取R=-R再试一次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-26
          • 2021-12-14
          • 2014-08-24
          • 1970-01-01
          • 1970-01-01
          • 2013-04-29
          • 2023-03-28
          相关资源
          最近更新 更多