5

私はMatlabでvlfeatをやっていて、この質問hereに従っています。

以下は私の簡単なテスト画像です。

左の画像:

L

右の画像:

R

ここで2つの単純な画像を使用して簡単なテストを行いました(右の画像は左の画像を回転させただけです)、結果は次のとおりです。

テスト

それは機能しますが、次のように、2 つの画像の SIFT ポイントを一致させて表示するというもう 1 つの要件があります。

このような

vl_ubcmatch が一致したインデックスの 2 つの配列を返すことは理解しています。2 つの画像のどのポイントがどのポイントに移動するかをマッピングすることは問題ではありません。しかし、私は現在 matlab の手順で立ち往生しています。私はこれを見つけまし。しかし、それはサブプロットがそのままである場合にのみ機能します。サブプロットに画像を追加すると、サイズが変更され、正規化が失敗します。

ここに私のコードがあります:(imとim2は画像です。f、dとf2、d2はそれぞれ2つの画像からのvl_sift関数からのフレームと記述子です)

    [matches score] = vl_ubcmatch(d,d2,threshold);%threshold originally is 1.5

if (mode >= 2)%verbose 2

    subplot(211);
    imshow(uint8(im));
    hold on;
    plot(f(1,matches(1,:)),f(2,matches(1,:)),'b*');

    subplot(212);
    imshow(uint8(im2));
    hold on;
    plot(f2(1,matches(2,:)),f2(2,matches(2,:)),'g*');

end

if (mode >= 3)%verbose 3

     [xa1 ya1] = ds2nfu(  f(1,matches(1,:)),  f(2,matches(1,:)));
     [xa2 ya2] = ds2nfu( f2(1,matches(2,:)), f2(2,matches(2,:)));

    for k=1:numel(matches(1,:))

        xxa1 = xa1(1, k);
        yya1 = ya1(1, k);
        xxa2 = xa2(1, k);
        yya2 = ya2(1, k);

        annotation('line',[xxa1 xxa2],[yya1 yya2],'color','r');
    end
end

上記のコードは次のようになります。

を

サブプロットは、このようなものには適していないと思います。Matlabでこれを行うためのより良い方法はありますか? できれば、OpenGL スタイルで 2D ゲームを描くのと同じように、自分のイメージを描画し、自由に線を引き、自由にズームできる空のパネルのようなものが欲しいです。

4

2 に答える 2

8

zplesivcak の提案から、はい、それは可能であり、結局のところそれほど問題ではありません。コードは次のとおりです。

%  After we have applied vl_sift with 2 images, we will get frames f,f2, 
%  and descriptor d,d2 of the images. After that, we can apply it into 
%  vl_ubcmatch to perform feature matching:

[matches score] = vl_ubcmatch(d,d2,threshold); %threshold originally is 1.5

% check for sizes and take longest width and longest height into
% account
if (size(im,1) > size(im2,1))
    longestWidth = size(im,1);       
else
    longestWidth = size(im2,1);
end

if (size(im,2) > size(im2,2))
    longestHeight = size(im,2);
else
    longestHeight = size(im2,2);
end


% create new matrices with longest width and longest height
newim = uint8(zeros(longestWidth, longestHeight, 3)); %3 cuz image is RGB
newim2 = uint8(zeros(longestWidth, longestHeight, 3));

% transfer both images to the new matrices respectively.
newim(1:size(im,1), 1:size(im,2), 1:3) = im;
newim2(1:size(im2,1), 1:size(im2,2), 1:3) = im2;

% with the same proportion and dimension, we can now show both
% images. Parts that are not used in the matrices will be black.
imshow([newim newim2]);

hold on;

    X = zeros(2,1);
    Y = zeros(2,1);

    % draw line from the matched point in one image to the respective matched point in another image.
    for k=1:numel(matches(1,:))

        X(1) = f(1, matches(1, k));
        Y(1) = f(2, matches(1, k));
        X(2) = f2(1, matches(2, k)) + longestHeight; % for placing matched point of 2nd image correctly.
        Y(2) = f2(2, matches(2, k));

        line(X,Y);

    end

テストケースは次のとおりです。

tc

質問の画像の 1 つのキャンバスの幅と高さを変更すると、上記のアルゴリズムがそれを処理し、それに応じて画像を表示することがわかります。未使用部分は黒くなります。さらに、アルゴリズムは 2 つの画像の特徴をそれぞれ一致させることができます。

編集:

または、Maurits によって提案された、よりクリーンで優れた実装については、Lowe SIFT matlab wrappersを確認してください。

于 2012-11-09T13:25:51.247 に答える
3

ディスクに Matlab Computer Vision Library が既にインストールされている場合は、単に使用できます。

M1 = [f(1, match(1, :)); f(2, match(1, :)); ones(1, length(match))];
M2 = [f2(1, match(2, :)); f2(2, match(2, :)); ones(1, length(match))];

showMatchedFeatures(im,im2,[M1(1:2, :)]',[M2(1:2, :)]','montage','PlotOptions',{'ro','g+','b-'} );
于 2015-04-10T20:48:53.397 に答える