我试图通过扫描从中拍摄的两张图像来估计相机的姿势,检测图像中的特征,匹配它们,创建基本矩阵,使用相机内在函数来计算基本矩阵然后将其分解以找到轮换和翻译。
这是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。计算机视觉新手......
答案 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)
最诚挚的问候。