Я выполняю SIFT сопоставление с VLFEAT в Matlab.
Единственное совпадение легко отобразить: я следовал за руководством.
Обновление 1: (извлечение проблемы из моих потребностей)
Далее я рассматриваю 4 разных вида сцены: я хочу сопоставить функцию, найденную в первой камере (внизу слева), с остальными.
Изображения уже неискажены.
Я мог сопоставить третье изображение: мне удалось исправить координаты со смещением для правильного отображения. Я установил высокий порог (меньше очков), чтобы получить более понятное изображение. Мой код размещен ниже, тогда возникнет вопрос
Указывая на это (это не влияет на вопрос или ответ, только имена переменных в моем коде)
Поскольку мои 4 камеры на самом деле являются стереокамерами, движущимися в пространстве, 4 камеры (и относительные выходы):
Внизу слева: левая камера с именем a. Особенности в этом изображенииfa
, дескрипторыda
...
Внизу справа: левая камера с именем a. Функции на этом изображении -fb
, дескрипторыdb
...
Слева вверху: левая камера с именем a в предыдущий момент. Особенности этого изображенияfa_old
, дескрипторыda_old
...
Вверху справа: правая камера с именем b в предыдущий момент. Функции на этом изображении:fb_old
, дескрипторыdb_old
...Движения меньше, поэтому я ожидал, что SIFT сможет получить те же точки.
Этот код находит точки и выполняет "синее соответствие" и "красное совпадение"
%classic instruction for searching feature
[fa,da] = vl_sift((Ia_f),'NormThresh', thresh_N, 'EdgeThresh', thresh_E) ;
% with the same line I obtain
%fa are features in the current left image (da are descriptors)
%fb are features in the current right image (db... )
%fa_old are features in the previous left image
%fb_old are features in the previous right image
%code from tutorials (find the feature)
[matches, scores] = vl_ubcmatch(da,db,thresh_SIFT) ;
[drop, perm] = sort(scores, 'descend') ;
matches = matches(:, perm);
%my code
figure(1) ; %clf ;
axis equal;
%prepare the image
imshow(cat(1,(cat(2, Ia_v_old, Ib_v_old)),cat(2,Ia_v,Ib_v)));
%matching between the left frames (current and previous)
[matches_prev, scores_prev] = vl_ubcmatch(da,da_old,thresh_SIFT) ;
[drop_prev, perm_prev] = sort(scores_prev, 'descend') ;
matches_prev = matches_prev(:, perm_prev) ;
%find index of descriptors in common, write them in order
I = intersect(matches(1,:), matches_prev(1,:),'stable');
MI_1 = arrayfun(@(x)find(matches(1,:)==x,1),I);
MI_2 = arrayfun(@(x)find(matches_prev(1,:)==x,1),I);
matches_M = matches(:,MI_1(:));
matches_prev_M = matches_prev(:,MI_2(:));
%features coordinates in the current images (bottom)
xa = fa(1,matches_M(1,:)) + offset_column ;
xb = fb(1,matches_M(2,:)) + size(Ia,2); %+offset_column-offset_column ;
ya = fa(2,matches_M(1,:)) + offset_row + size(Ia,1);
yb = fb(2,matches_M(2,:)) + offset_row + size(Ia,1);
%matching "in space" (blue lines)
space_corr = line([xa ; xb], [ya ; yb]) ;
set(space_corr,'linewidth', 1, 'color', 'b') ;
%plotting features
fa(1,:) = fa(1,:) + offset_column ;
fa(2,:) = fa(2,:) + offset_row + size(Ia,1);
vl_plotframe(fa(:,matches_M(1,:))) ;
fb(1,:) = fb(1,:) + size(Ia,2) ;
fb(2,:) = fb(2,:) + offset_row + size(Ia,1);
vl_plotframe(fb(:,matches_M(2,:))) ;
%matching "in time" %corrx and coor y are corrected offsets
xa2 = fa_old(1,matches_prev_M(2,:)) + corrx; %coordinate per display
ya2 = fa_old(2,matches_prev_M(2,:)) - size(Ia,1) + corry;
fa_old(1,:) = fa_old(1,:) + corrx;
fa_old(2,:) = fa_old(2,:) - size(Ia,1) + corry;
fb_old(1,:) = fb_old(1,:) + corrx ;
fb_old(2,:) = fb_old(2,:) - size(Ia,1) + corry;
%plot red lines
time_corr = line([xa ; xa2], [ya ; ya2]) ;
set(time_corr,'linewidth', 1, 'color', 'r') ;
%plot feature in top left image
vl_plotframe(fa_old(:,matches_prev_M(2,:))) ;
%plot feature in top right image
vl_plotframe(fb_old(:,matches_ex_M(2,:))) ;
Все работает. Я подумал повторить несколько строк кода и найти правильный индексный массив matches_ex_M
в правильном порядке и, наконец, соединить эту функцию на последнем (верхнем правом) изображении (с любым другим изображением)
% one of many tries (all wrong)
[matches_ex, scores_ex] = vl_ubcmatch(da_old,db_old,thresh_SIFT) ;
[drop_ex, perm_ex] = sort(scores_ex, 'descend') ;
matches_ex = matches_ex(:, perm_ex);
Ib = intersect(matches_prev_M(2,:), matches_ex(1,:),'stable');
MIb_2 = arrayfun(@(x)find(matches_ex(1,:)==x,1),Ib);
matches_ex_M = matches_ex(:,MIb_2(:));
Проблема в том, что новое пересечение вызовет новый порядок, и все совпадения будут неправильными. Но я должен признать, что у меня больше нет идей, после того, как я попробовал все возможные комбинации соответствующих индексных массивов. Проблема в том, что я не могу выполнить ни пересечение трех массивов одновременно, ни изменение их порядка. Избранные хорошо отображаются на всех 4 изображениях, и я могу выполнять одиночные совпадения из любого изображения в другое в различных сценариях. В верхнем правом изображении есть те же функции, но в другом порядке.
Что я получаю (очевидно, неправильно)
Синтезирую мой пробем:
Я думал, что я должен изменить порядок точек в верхнем правом кадре, чтобы получить хорошее "желтое" соответствие, но я не знаю, как сделать это без изменения порядка в верхнем левом углу (это уничтожит "красное") соответствие "и/или" синее соответствие ")
Любая идея? Любая другая стратегия? Спасибо всем заранее.
ОБНОВЛЕНИЕ 2: Подумав о переходе с MATLAB + VLFEAT на Python (2.7) + OpenCV (2.4.13) (я бы предпочел иметь решение в Matlab и VLFEAT), я нашел этот ответ. Кто-то может сделать это в C++. Но я не могу конвертировать ни в Matlab, ни в Python. Также может быть принято питонное решение (по этой причине добавлены надлежащие теги).