xlabel titles tag comando and matlab opencv order computer-vision vlfeat

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 son fa , descriptors da ...
Abajo a la derecha : cámara izquierda llamada a . Las características en esta imagen son fb , descriptors db ...
Arriba a la izquierda : cámara izquierda llamada a en el instante anterior. Las características de esta imagen son fa_old , descriptors da_old ...
Arriba a la derecha : cámara derecha llamada b en el instante anterior. Las características de esta imagen son fb_old , descriptors db_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).