基本矩阵中的错误?

时间:2014-12-01 07:12:43

标签: matlab computer-vision signal-processing matlab-cvst pose-estimation

我试图通过扫描从中拍摄的两张图像来估计相机的姿势,检测图像中的特征,匹配它们,创建基本矩阵,使用相机内在函数来计算基本矩阵然后将其分解以找到轮换和翻译。

这是matlab代码:

I1 = rgb2gray(imread('1.png'));
I2 = rgb2gray(imread('2.png'));

points1 = detectSURFFeatures(I1);
points2 = detectSURFFeatures(I2);

points1 = points1.selectStrongest(40);
points2 = points2.selectStrongest(40);

[features1, valid_points1] = extractFeatures(I1, points1);
[features2, valid_points2] = extractFeatures(I2, points2);

indexPairs = matchFeatures(features1, features2);

matchedPoints1 = valid_points1(indexPairs(:, 1), :);
matchedPoints2 = valid_points2(indexPairs(:, 2), :);

F = estimateFundamentalMatrix(matchedPoints1,matchedPoints2);

K = [2755.30930612600,0,0;0,2757.82356074384,0;1652.43432833339,1234.09417974414,1];

%figure; showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);

E = transpose(K)*F*K;
W = [0,-1,0;1,0,0;0,0,1];
Z = [0,1,0;-1,0,0;0,0,0];
[U,S,V] = svd(E);

R = U*inv(W)*transpose(V);

T = U(:,3);

thetaX = radtodeg(atan2(R(3,2),R(3,3)));
thetaY = radtodeg(atan2(-R(3,1),sqrt(R(3,2)^2 +R(3,3)^2)));
thetaZ = radtodeg(atan2(R(2,1),R(1,1)));

我面临的问题是R和T总是不正确的。 ThetaZ大部分时间都等于~90,如果我重复计算很多次,我有时会得到预期的角度。 (仅在某些情况下)

我似乎不明白为什么。这可能是因为我计算的基本矩阵是错误的。或者我在哪里出错了?

T中的比例/单位是多少? (翻译矢量)或者推断不同。

P.S。计算机视觉新手......

3 个答案:

答案 0 :(得分:2)

请注意,通过分解E,可能有4种解决方案(2种可能的旋转X 2种可能的翻译)。 特别是关于R,它也可以是: R = U W 转置(V); 同样,T也可以是: T = -U(:,3);

要检查这是否是您的错误,请在此处发布所有4种可能的解决方案,以获得您获得ThetaZ~90的特定情况。

我要检查的另一件事(因为你有K),是直接估计基本矩阵(不经过基本矩阵):http://www.mathworks.com/matlabcentral/fileexchange/47032-camera-geometry-algorithms/content//CV/CameraGeometry/EssentialMatrixFrom2DPoints.m

答案 1 :(得分:0)

尝试转置K.你从estimateCameraParameters获得的K假设行向量后面乘以矩阵,而大多数教科书中的K假设列向量预先乘以矩阵。

编辑:在计算机视觉系统工具箱的R2015b版本中,有一个cameraPose功能,可以计算基本矩阵的相对方向和位置。

答案 2 :(得分:0)

U和V需要被强制执行为SO(3)。 http://mathworld.wolfram.com/SpecialOrthogonalMatrix.html 换句话说,如果U和/或V具有负确定性,则需要否定U和/或V中的最后一列。 (det(U)< 0)=> U(:,3)= -U(:,3)

最诚挚的问候。