1

最近、2 つのステレオ イメージ ペアのイメージ修正に関する興味深い記事を見つけました。アルゴリズムが非常にコンパクトで、記事が示唆していたことから、正しいことをしたので、私はアルゴリズムが好きでした. 2 つの画像に matlab バージョンを実装した後、修正された正しい画像が得られませんでした。ピクセルのある左と下のラインを除いて、真っ暗な画像が得られました。画像には、元の画像の灰色のピクセルもいくつかありましたが、ほんの一握りです。私はmatlabコードの下に投稿し、記事へのリンクと、1つの画像で得た結果の例も示しました(他の画像でも同じでした)

これは、ステレオ ペアの修正のためのコンパクトなアルゴリズムの記事へのリンクです。

初期画像と結果のスクリーン ショットは次のとおりです。 スクリーンショット

最初の画像は次の 2 つです (別のステレオ ペアを検索する必要がないように) :ステレオ画像 1 こちら ここにステレオ画像2

function [T1,T2,Pn1,Pn2] = rectify(Po1,Po2)

% RECTIFY: compute rectification matrices 

% factorize old PPMs
[A1,R1,t1] = art(Po1);
[A2,R2,t2] = art(Po2);

 % optical centers (unchanged)
c1 = - inv(Po1(:,1:3))*Po1(:,4);
c2 = - inv(Po2(:,1:3))*Po2(:,4);

% new x axis (= direction of the baseline)
 v1 = (c1-c2);
% new y axes (orthogonal to new x and old z)
v2 = cross(R1(3,:)',v1);
% new z axes (orthogonal to baseline and y)
v3 = cross(v1,v2);

% new extrinsic parameters 
R = [v1'/norm(v1)
   v2'/norm(v2)
   v3'/norm(v3)];
% translation is left unchanged

% new intrinsic parameters (arbitrary) 
A = (A1 + A2)./2;
A(1,2)=0; % no skew
A(1,3) = A(1,3) + 160;
% new projection matrices
Pn1 = A * [R -R*c1 ];
Pn2 = A * [R -R*c2 ];

% rectifying image transformation
T1 = Pn1(1:3,1:3)* inv(Po1(1:3,1:3));
T2 = Pn2(1:3,1:3)* inv(Po2(1:3,1:3));

function [A,R,t] = art(P)
% ART: factorize a PPM as  P=A*[R;t]
Q = inv(P(1:3, 1:3));
[U,B] = qr(Q);

R = inv(U);
t = B*P(1:3,4);
A = inv(B);
A = A ./A(3,3);

これは、修正関数を呼び出す「メイン」コードです

img1 = imread('D:\imag1.png');
img2 = imread('D:\imag2.png');

im1 = rgb2gray(img1);
im2 = rgb2gray(img2);

im1 = im2double(im1);
im2 = im2double(im2);

figure; imshow(im1, 'border', 'tight')
figure; imshow(im2, 'border', 'tight')

%pair projection matrices obtained after the calibration P01,P02

a = double(9.765*(10^2))
b = double(5.790*(10^-1))
format bank;
Po1 = double([a 5.382*10 -2.398*(10^2) 3.875*(10^5); 
    9.849*10 9.333*(10^2) 1.574*(10^2) 2.428*(10^5);
    b 1.108*(10^(-1)) 8.077*(10^(-1)) 1.118*(10^3)]);
Po2 = [9.767*(10^2) 5.376*10 -2.400*(10^2) 4.003*(10^4);
    9.868*10 9.310*(10^2) 1.567*(10^2) 2.517*(10^5);
    5.766*(10^(-1)) 1.141*(10^(-1)) 8.089*(10^(-1)) 1.174*(10^3)];
[T1, T2, Pn1, Pn2] = rectify(Po1, Po2);

imnoua =  conv2(im1, T1);
imnoua2 = conv2(im2, T2);

fprintf('Imaginea noua e \n');

figure; imshow(imnoua, 'border', 'tight')
figure; imshow(imnoua2, 'border', 'tight')

お時間をいただきありがとうございます!

4

1 に答える 1

2

Shai が言うように、T1T2は射影変換行列であり、フィルター カーネルではありません。imwarpではなく、を使用する必要がありますconv2

imnoua = imwarp(im1, projective2d(T1));
imnoua2 = imwarp(im2, projective2d(T2));

さらに良いrectifyStereoImagesのは、Computer Vision System Toolbox から使用することです。この例をチェックしてください。

于 2014-09-09T13:59:32.837 に答える