Застревание в механизме подзаговора Matlab для сопоставления точек изображений для vlfeat

Я делаю vlfeat в Matlab, и я слежу за этим вопросом -are">здесь.

Ниже приведены мои простые тестовые изображения:

Левое изображение:

L

Правое изображение:

R

Я провел здесь простой тест с двумя простыми изображениями (правое изображение — это просто повернутая версия левого), и я получил соответствующий результат:

тест

Это работает, но у меня есть еще одно требование: сопоставить точки SIFT двух изображений и показать их, например:

likethis

Я понимаю, что vl_ubcmatch возвращает 2 массива совпадающих индексов, и не проблема сопоставить их, какая точка идет к какой точке на двух изображениях. Однако в настоящее время я застрял в процедуре Matlab. Я нашел это. Но это работает только в том случае, если сюжет остается таким. Когда вы добавляете изображение в подзаголовок, размер изменяется, а нормализация не удалась.

Вот мой код: (im и im2 — изображения. f, d и f2, d2 — кадры и дескрипторы из функции vl_sift из 2-х изображений соответственно)

    [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

Приведенный выше код дает следующее:

an

Я думаю, что подзаговор - не лучший способ пойти на что-то подобное. Есть ли лучший метод для этого в Matlab? Если возможно, я хочу что-то вроде пустой панели, на которой я могу рисовать свое изображение, свободно рисовать линии и свободно масштабировать, точно так же, как рисовать 2D-игры в стиле OpenGL.


person Karl    schedule 09.11.2012    source источник
comment
Поможет ли изменение размера одного изображения и добавление его справа от другого? Вы можете сделать это с помощью imshow([im imresize(im2, size(im)); (ссылка на изменение размера). Но я думаю, вы уже подумали об этом...   -  person plesiv    schedule 09.11.2012
comment
@zplesivcak: слишком проблематично, если пропорции обоих изображений не совпадают.   -  person Karl    schedule 09.11.2012
comment
@Karl, почему, обертки Lowe SIFT Matlab поставляются с функцией, которая прекрасно объединяет два изображения в одно большое. Мне кажется проще, чем пытаться контролировать, как работает интервал/разрешение графического интерфейса Matlab.   -  person Maurits    schedule 09.11.2012
comment
@Maurits: Чувак, ты должен прийти пару часов назад. Если бы я знал, что у нас это есть, мне не пришлось бы кодировать все это самому. Кроме того, я вижу, что придатки функции Matlab Дэвида Лоу намного эффективнее и чище, чем я.   -  person Karl    schedule 09.11.2012


Ответы (2)


Судя по предложению 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

Изменяя ширину и высоту холста одного из изображений из вопроса, мы видим, что приведенный выше алгоритм позаботится об этом и соответствующим образом отобразит изображение. Неиспользуемая область будет черной. Кроме того, мы видим, что алгоритм может сопоставлять признаки двух изображений соответственно.

ИЗМЕНИТЬ:

В качестве альтернативы, предложенной Maurits, для более чистой и лучшей реализации ознакомьтесь с обертками Lowe SIFT matlab.

person Karl    schedule 09.11.2012

Если на вашем диске уже установлена ​​библиотека Matlab Computer Vision, вы можете просто использовать

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-'} );
person SimaGuanxing    schedule 10.04.2015