2012-09-20 23 views
10

Quiero unir dos imágenes usando Python + OpenCV. He utilizado SURF para extraer los puntos clave y los descriptores de ambos. Ahora, necesito hacer coincidir estos descriptores y por esta razón decidí usar Flann Matcher.Error al usar knnMatch con OpenCV + Python

flann_params = dict(algorithm = FLANN_INDEX_KDTREE,trees = 4)  
matcher = cv2.FlannBasedMatcher(flann_params, {}) 

Pero cuando trato de usar knnMatch con descriptores (desc1, Desc2), OPENCV lanza una excepción.

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) 

La excepción es la siguiente:

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) #2 
cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpp:299: error: (-210) type=6 
in function buildIndex_ 

cómo podría utilizar knnMatch correctamente? ¿Es un error?

Respuesta

10

I resuelto este problema utilizando el tipo de datos correcto con la np.asarray función()

raw_matches=matcher.knnMatch(np.asarray(desc1,np.float32),np.asarray(desc2,np.float32), 2) #2 
+0

El error desapareció pero no puede encontrar nada. –

0

Ver la respuesta a this question.

Aquí está el código en cuestión, desde Esteban Angee 's respuesta:

r_threshold = 0.6 
FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing 

Construir su diccionario parámetros:

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4) 
flann = cv2.flann_Index(desc2, flann_params) 

realiza una búsqueda de los vecinos más cercanos:

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict 
mask = dist[:,0]/dist[:,1] < r_threshold 
idx1 = np.arange(len(desc1)) 
pairs = np.int32(zip(idx1, idx2[:,0])) 

devuelve los descriptores que coincide con:

No estoy en mi estación de trabajo en este momento, así que me temo que no puedo ver qué pasa con el código, pero la pregunta anterior resolvió todos mis problemas cuando tuve el mismo problema. No tiene que usar FlannBasedMatcher, recuerdo que también tuve problemas con él.

Si no ayuda, veré si puedo encontrar mi solución mañana más o menos.

+0

Tengo el mismo error, pero en este caso utilizando IDX2 = cv2.flann_Index() idx2.build (np. asarray (desc2), flann_params) cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpp:299 : error: (-210) tipo = 6 en la función buildIndex_ – Sergio

+0

¿Has probado el código que publiqué en mi respuesta? Funcionó para mí Me temo que realmente no entiendo tu comentario? – casper

+0

Sí, estoy usando OpenCV-2.4.2. Cuando probé su código cv2.flann_Index (desc2, flann_params) arrojó una excepción sobre ningún módulo. Leí que necesita codificar las siguientes funciones: idx2 = cv2.flann_Index() idx2.build (np.asarray (desc2), flann_params) – Sergio

Cuestiones relacionadas