OpenCV característica coincidente para múltiples imágenes
¿Cómo puedo optimizar la coincidencia de la función SIFT para muchas imágenes con FLANN?
Tengo un ejemplo de trabajo tomado de los documentos de Python OpenCV. Sin embargo, esto es comparar una imagen con otra y es lenta. Lo necesito para buscar características que coincidan en una serie de imágenes (unos pocos miles) y necesito que sea más rápido.
Mi idea actual:
Ejecute todas las imágenes y guarde las funciones. ¿Cómo?Compare una imagen de una cámara con esta base anterior y encuentre la correcta. ¿Cómo?Dame el resultado, la imagen a juego o algo así.import sys # For debugging only import numpy as np import cv2 from matplotlib import pyplot as plt MIN_MATCH_COUNT = 10 img1 = cv2.imread('image.jpg',0) # queryImage img2 = cv2.imread('target.jpg',0) # trainImage # Initiate SIFT detector sift = cv2.SIFT() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) search_params = dict(checks = 50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1,des2,k=2) # store all the good matches as per Lowe's ratio test. good = [] for m,n in matches: if m.distance MIN_MATCH_COUNT: src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2) dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) matchesMask = mask.ravel().tolist() h,w = img1.shape pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) dst = cv2.perspectiveTransform(pts,M) img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA) else: print "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT) matchesMask = None draw_params = dict(matchColor = (0,255,0), # draw matches in green color singlePointColor = None, matchesMask = matchesMask, # draw only inliers flags = 2) img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params) plt.imshow(img3, 'gray'),plt.show()
ACTUALIZAR
Después de probar muchas cosas, podría haberme acercado a la solución ahora. Espero que sea posible construir el índice y luego buscarlo así:
flann_params = dict(algorithm=1, trees=4) flann = cv2.flann_Index(npArray, flann_params) idx, dist = flann.knnSearch(queryDes, 1, params={})
Sin embargo, todavía no he logrado construir un npArray aceptado para el parámetro flann_Index.
loop through all images as image: npArray.append(sift.detectAndCompute(image, None)) npArray = np.array(npArray)