本质矩阵中的旋转和平移不正确

6

我目前拥有一套立体相机系统。我已经对两个相机进行了校准,并获得了两个相机的内部矩阵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,公式为E = K2'*F*K1。我使用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(即相对于K1的中心测量K2的中心)。
现在假设我使用我的对应点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解决方案,其中该点在两个相机之前,并且两个相机都指向前方。

我的流程或思路有什么问题吗?是否有可能获得每个像素射线的信息?

3个回答

2
当你将本质矩阵分解为Rt时,会得到4个不同的解。其中三个解会将点投影到一个或两个相机的后面,只有一个解是正确的。你需要通过对一些样本点进行三角测量来测试哪个解是正确的。
在MATLAB的计算机视觉系统工具箱中有一个名为cameraPose的函数,可以帮你完成这个过程。

0

如果不是这样的话,应该是C1-C2 = transpose([v2 -v1] * transpose([t s])。这个方法可行。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接