Cómo obtener coordenadas de píxel de Feature Matching en OpenCV Python

Necesito obtener la lista de las coordenadas x e y de los píxeles que el comparador de características selecciona en el código provisto. Estoy usando Python y OpenCV. ¿Alguien puede ayudarme?

 img1=cv2.imread('DSC_0216.jpg',0) img2=cv2.imread('DSC_0217.jpg',0) orb=cv2.ORB(nfeatures=100000) kp1,des1=orb.detectAndCompute(img1,None) kp2,des2=orb.detectAndCompute(img2,None) img1kp=cv2.drawKeypoints(img1,kp1,color=(0,255,0),flags=0) img2kp=cv2.drawKeypoints(img2,kp2,color=(0,255,0),flags=0) cv2.imwrite('m_img1.jpg',img1kp) cv2.imwrite('m_img2.jpg',img2kp) bf=cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches=bf.match(des1,des2) matches=sorted(matches, key= lambda x:x.distance) 

Sabemos que sus puntos clave se almacenan en kp1 y kp2 donde son las características que coinciden con la primera y la segunda imagen respectivamente. En la perspectiva cv2.ORB , estas son matrices 2D donde cada fila es un punto clave que se detecta en la primera imagen, kp1 y la segunda imagen, kp2 .

En su caso, porque está utilizando cv2.BFMatch , las matches devuelven una lista de objetos cv2.DMatch donde cada objeto contiene varios miembros … entre ellos hay dos miembros importantes:

  • queryIdx : el índice o fila de la matriz de puntos de interés kp1 que coincide
  • trainIdx – El índice o fila de la matriz de puntos de interés kp2 que coincide

Por lo tanto, queryIdx y trainIdx dicen qué características de ORB coinciden entre kp1 y kp2 . Por lo tanto, los usaría para indexar en kp1 y kp2 y obtener el miembro pt , que es una tupla de coordenadas (x,y) que determinan las coordenadas espaciales reales de las coincidencias.

Todo lo que tienes que hacer es iterar a través de cada objeto cv2.DMatch en las matches , añadir a una lista de coordenadas para kp1 y kp2 y listo.

Algo como esto:

 # Initialize lists list_kp1 = [] list_kp2 = [] # For each match... for mat in matches: # Get the matching keypoints for each of the images img1_idx = mat.queryIdx img2_idx = mat.trainIdx # x - columns # y - rows # Get the coordinates (x1,y1) = kp1[img1_idx].pt (x2,y2) = kp2[img2_idx].pt # Append to each list list_kp1.append((x1, y1)) list_kp2.append((x2, y2)) 

Tenga en cuenta que podría haber hecho list_kp1.append(kp1[img1_idx].pt) y lo mismo para list_kp2 , pero quería dejar muy claro cómo interpretar las coordenadas espaciales. También podría ir un paso más allá y hacer una lista de comprensión:

 list_kp1 = [kp1[mat.queryIdx].pt for mat in matches] list_kp2 = [kp2[mat.trainIdx].pt for mat in matches] 

list_kp1 contendrá las coordenadas espaciales de un punto de entidad que list_kp2 con la posición correspondiente en list_kp2 . En otras palabras, el elemento i de list_kp1 contiene las coordenadas espaciales del punto de característica de img1 que coinciden con el punto de característica correspondiente de img2 en list_kp2 cuyas coordenadas espaciales están en el elemento i .


Como una drawMatches de drawMatches secundaria, utilicé este concepto cuando escribí una solución para drawMatches porque para OpenCV 2.4.x, el envoltorio de Python para la función C ++ no existe, por lo que hice uso del concepto anterior para ubicar las coordenadas espaciales de la coincidencia Características entre las dos imágenes para escribir mi propia implementación de la misma.

Compruébalo si quieres!

módulo ‘objeto no tiene atributo’ drawMatches ‘opencv python