カメラから取得した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 はどのスケール/単位ですか? (翻訳ベクトル) または別の方法で推論されます。
PS コンピュータビジョンの初心者...