Я выполняю сопоставление 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. Питоническое решение также может быть принято (по этой причине добавлены правильные теги).
time_corr = line([xa ; xa2], [ya ; ya2]);
, мне нужно изменить порядок вектора признаков. Но сопоставление выполняется с вектором дескриптора. Я не мог изменить этот порядок, чтобы получить правильное соответствие желтого цвета. - person marcoresk   schedule 05.01.2017fa_old
, можете ли вы показать, что произойдет, если вы сопоставите функции сfb
? - person ilke444   schedule 17.01.2017