titles - title graphics matlab
Matlab VLFEAT: coincidencia mĂșltiple (0)
Estoy realizando una coincidencia SIFT con VLFEAT en Matlab.
Una sola coincidencia es simple de visualizar: seguí el tutorial.
Actualización 1: (extrayendo el problema de mis necesidades)
A continuación, considero 4 vistas diferentes de la escena: quiero hacer coincidir la función encontrada en la primera cámara (abajo a la izquierda) con las demás.
Las imágenes ya están sin distorsión.
Podría hacer coincidir una tercera imagen: logré corregir las coordenadas con compensaciones para una visualización adecuada. Establecí el umbral alto (menos puntos) para tener una imagen más comprensible. Mi código se publica a continuación, luego estará la pregunta
Señalando eso (no afecta la pregunta o la respuesta, solo los nombres de variables en mi código)
Como mis 4 cámaras son de hecho una cámara estéreo que se mueve en el espacio, las 4 cámaras (y salidas relativas) son:
Abajo a la izquierda : cámara izquierda llamada a . Las características en esta imagen sonfa
, descriptorsda
...
Abajo a la derecha : cámara izquierda llamada a . Las características en esta imagen sonfb
, descriptorsdb
...
Arriba a la izquierda : cámara izquierda llamada a en el instante anterior. Las características de esta imagen sonfa_old
, descriptorsda_old
...
Arriba a la derecha : cámara derecha llamada b en el instante anterior. Las características de esta imagen sonfb_old
, descriptorsdb_old
...Los movimientos son más pequeños, así que esperaba que SIFT pudiera recuperar los mismos puntos.
Este código encuentra puntos y realiza el "emparejamiento azul" y el "emparejamiento rojo"
%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,:))) ;
Todo funciona Pensé repetir algunas líneas de código y encontrar la matriz de índices matches_ex_M
adecuada en el orden correcto y finalmente conectar la función en la última imagen (arriba a la derecha) (con cualquiera de las otras imágenes)
% 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(:));
El problema es que una nueva intersección causará un nuevo pedido y todas las coincidencias serán incorrectas. Pero he admitido que no tengo más ideas, después de probar todas las combinaciones posibles de arreglos de índices coincidentes. El problema es que no puedo realizar ninguna intersección entre 3 arrays simultáneamente, ni cambiar su orden. Los destacados se muestran bien en las 4 imágenes y puedo realizar coincidencias únicas de cualquier imagen a otra en diferentes secuencias de comandos. En las imágenes superiores derechas hay las mismas características pero con diferente orden.
Lo que obtengo (obviamente incorrecto)
Sintetizando mi probem:
Pensé que debería cambiar el orden de los puntos en el marco superior derecho para tener una buena coincidencia "amarilla", pero no sé cómo hacerlo sin cambiar el orden en la parte superior izquierda (esto destruirá el "rojo") coincidencia "y / o" coincidencia azul ")
¿Alguna idea? Cualquier estrategia diferente? Gracias a todos de antemano.
ACTUALIZACIÓN 2 : Después de pensar en cambiar de MATLAB + VLFEAT a Python (2.7) + OpenCV (2.4.13) ( prefiero tener una solución en Matlab y VLFEAT ) encontré esta respuesta . Alguien podría hacer eso en C ++. Pero no puedo convertirlo ni en Matlab ni en Python. También podría aceptarse una solución pitonica (por ejemplo, etiquetas adecuadas adicionales).