首页 文章

基本矩阵中的错误?

提问于
浏览
2

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

这是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中还有什么比例/单位? (翻译矢量)或者是不同的推断 .

附:计算机视觉新手......

3 回答

  • 0

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

    Edit: 在计算机视觉系统工具箱的R2015b版本中,有一个cameraPose函数,它根据基本矩阵计算相对方向和位置 .

  • 2

    请注意,通过分解E,可能有4种解决方案(2种可能的旋转X 2种可能的翻译) . 具体而言,关于R,它也可以是:R = UWtranspose(V);类似地,T也可以是:T = -U(:,3);

    要检查这是否是您的错误,请在此处发布针对给定案例的所有4种可能的解决方案,其中您将获得ThetaZ~90 .

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

  • 0

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

    最好的祝福 .

相关问题