2

カメラから取得した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 コンピュータビジョンの初心者...

4

3 に答える 3

2

E を分解すると、4 つの解が可能であることに注意してください (2 回の回転 X 2 回の並進)。特に R に関しては、次のようにもなります。 R = U W transpose(V); 同様に、T も次のようになります。 T = -U(:,3);

これがあなたのバグかどうかを確認するには、ThetaZ~90 を取得した場合に考えられる 4 つの解決策すべてをここに投稿してください。

私がチェックするもう1つのこと(Kがあるため)は、基本行列を直接(基本行列を経由せずに)推定することです:http://www.mathworks.com/matlabcentral/fileexchange/47032-camera-geometry-algorithms/content/ /CV/CameraGeometry/EssentialMatrixFrom2DPoints.m

于 2014-12-01T17:56:53.580 に答える