Matlab VLFEAT - множественное сопоставление

Я выполняю сопоставление 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. Питоническое решение также может быть принято (по этой причине добавлены правильные теги).


person marcoresk    schedule 02.01.2017    source источник
comment
Я не могу понять, в чем конкретно ваша проблема. Вы получаете хорошее соответствие между функциями во времени и между камерами в нижних кадрах, и вы хотите использовать это для сопоставления между верхними кадрами? Это все?   -  person buzjwa    schedule 05.01.2017
comment
@Naveh У меня хорошее соответствие между нижними кадрами. Верхние кадры были предыдущими нижними кадрами (в предыдущей итерации). Я хотел бы получить одну и ту же точку во всех 4 кадрах (если это возможно с итеративной структурой). Сохраняя предыдущие значения, с переупорядочением мне удалось получить соответствие в 3 кадрах... но переупорядочив точки в верхнем левом кадре, я теряю соответствие, ранее найденное с верхним правым кадром. Я вынужден сделать пересечение + изменить порядок, потому что точки, найденные в следующей итерации (нижние кадры), не могут быть одинаковыми.   -  person marcoresk    schedule 05.01.2017
comment
@Naveh Я думал, что должен изменить порядок точек в верхнем правом кадре, чтобы получить хорошее сопоставление желтого цвета, но я не знаю, как это сделать, не меняя порядок в левом верхнем углу (это разрушит красное соответствие)   -  person marcoresk    schedule 05.01.2017
comment
Так это проблема сопоставления или проблема индексации? Судя по изображению, это похоже на проблему соответствия. Если да, то я не понимаю, при чем здесь порядок точек.   -  person buzjwa    schedule 05.01.2017
comment
@Naveh Я думаю, что это и то, и другое. Чтобы эта линия работала правильно time_corr = line([xa ; xa2], [ya ; ya2]);, мне нужно изменить порядок вектора признаков. Но сопоставление выполняется с вектором дескриптора. Я не мог изменить этот порядок, чтобы получить правильное соответствие желтого цвета.   -  person marcoresk    schedule 05.01.2017
comment
Переупорядочивание соответствует! Если ваш метод сопоставления дает вам неправильное переупорядочение, значит, есть проблема с методом (или с дескрипторами).   -  person buzjwa    schedule 05.01.2017
comment
Давайте продолжим обсуждение в чате.   -  person buzjwa    schedule 05.01.2017
comment
@marcoresk вы пытались написать свою собственную функцию сопоставления? Возможно, расстояние L2 не совсем соответствует вашим потребностям. Или, например, сосредоточьтесь на сопоставлении только верхних изображений, независимо от других изображений, а затем просто добавьте решение к остальной части кода.   -  person Mark    schedule 11.01.2017
comment
@ Марк Нет, не видел. Я полагался на библиотеку VLFEAT для функций сопоставления и обнаружения, это займет у меня слишком много времени, чтобы написать свою собственную функцию. И я думаю, что это не будет полезно: для каждой 6 возможных пар изображений работает одиночное совпадение. Таким образом, проблема по-прежнему заключается в том, как сделать правильное пересечение, найти общие дескрипторы во всех 4 изображениях и изменить порядок каждого массива, чтобы иметь правильное соответствие x, y.   -  person marcoresk    schedule 11.01.2017
comment
Вместо того, чтобы сопоставлять его с fa_old, можете ли вы показать, что произойдет, если вы сопоставите функции с fb?   -  person ilke444    schedule 17.01.2017
comment
@ ilke444 Я обновлю изображение как можно скорее, но это будет та же беспорядочная группа желтых линий.   -  person marcoresk    schedule 17.01.2017
comment
Пожалуйста, предоставьте фотографии и ваш полный код.   -  person HoomanShan    schedule 23.10.2017
comment
Вы все еще ищете ответ на этот вопрос? Если да, я внимательно прочитаю ваш вопрос. У меня в голове несколько вопросов.   -  person Rakshit Kothari    schedule 29.11.2018
comment
@RakshitKothari спасибо, но я ушел из этого проекта год назад.   -  person marcoresk    schedule 30.11.2018