python opencv computer-vision

OpenCV 2.4.1-computando los descriptores SURF en Python



sift opencv python (2)

Estoy intentando actualizar mi código para usar cv2.SURF() en lugar de cv2.FeatureDetector_create("SURF") y cv2.DescriptorExtractor_create("SURF") . Sin embargo, estoy teniendo problemas para obtener los descriptores después de detectar los puntos clave. ¿Cuál es la forma correcta de llamar a SURF.detect ?

Intenté seguir la documentación de OpenCV, pero estoy un poco confundido. Esto es lo que dice en la documentación.

Python: cv2.SURF.detect(img, mask) → keypoints¶ Python: cv2.SURF.detect(img, mask[, descriptors[, useProvidedKeypoints]]) → keypoints, descriptors

¿Cómo paso los puntos clave cuando hago la segunda llamada a SURF.detect ?


No estoy seguro de si entiendo sus preguntas correctamente. Pero si está buscando una muestra de puntos clave SURF coincidentes, a continuación se encuentra uno muy simple y básico, que es similar a la coincidencia de plantillas:

import cv2 import numpy as np # Load the images img =cv2.imread(''messi4.jpg'') # Convert them to grayscale imgg =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # SURF extraction surf = cv2.SURF() kp, descritors = surf.detect(imgg,None,useProvidedKeypoints = False) # Setting up samples and responses for kNN samples = np.array(descritors) responses = np.arange(len(kp),dtype = np.float32) # kNN training knn = cv2.KNearest() knn.train(samples,responses) # Now loading a template image and searching for similar keypoints template = cv2.imread(''template.jpg'') templateg= cv2.cvtColor(template,cv2.COLOR_BGR2GRAY) keys,desc = surf.detect(templateg,None,useProvidedKeypoints = False) for h,des in enumerate(desc): des = np.array(des,np.float32).reshape((1,128)) retval, results, neigh_resp, dists = knn.find_nearest(des,1) res,dist = int(results[0][0]),dists[0][0] if dist<0.1: # draw matched keypoints in red color color = (0,0,255) else: # draw unmatched in blue color print dist color = (255,0,0) #Draw matched key points on original image x,y = kp[res].pt center = (int(x),int(y)) cv2.circle(img,center,2,color,-1) #Draw matched key points on template image x,y = keys[h].pt center = (int(x),int(y)) cv2.circle(template,center,2,color,-1) cv2.imshow(''img'',img) cv2.imshow(''tm'',template) cv2.waitKey(0) cv2.destroyAllWindows()

A continuación, se muestran los resultados que obtuve (copie la imagen de la plantilla pegada en la imagen original con pintura):

Como puedes ver, hay algunos pequeños errores . Pero para una startup, espero que esté bien.


Una mejora del algoritmo anterior es:

import cv2 import numpy opencv_haystack =cv2.imread(''haystack.jpg'') opencv_needle =cv2.imread(''needle.jpg'') ngrey = cv2.cvtColor(opencv_needle, cv2.COLOR_BGR2GRAY) hgrey = cv2.cvtColor(opencv_haystack, cv2.COLOR_BGR2GRAY) # build feature detector and descriptor extractor hessian_threshold = 85 detector = cv2.SURF(hessian_threshold) (hkeypoints, hdescriptors) = detector.detect(hgrey, None, useProvidedKeypoints = False) (nkeypoints, ndescriptors) = detector.detect(ngrey, None, useProvidedKeypoints = False) # extract vectors of size 64 from raw descriptors numpy arrays rowsize = len(hdescriptors) / len(hkeypoints) if rowsize > 1: hrows = numpy.array(hdescriptors, dtype = numpy.float32).reshape((-1, rowsize)) nrows = numpy.array(ndescriptors, dtype = numpy.float32).reshape((-1, rowsize)) #print hrows.shape, nrows.shape else: hrows = numpy.array(hdescriptors, dtype = numpy.float32) nrows = numpy.array(ndescriptors, dtype = numpy.float32) rowsize = len(hrows[0]) # kNN training - learn mapping from hrow to hkeypoints index samples = hrows responses = numpy.arange(len(hkeypoints), dtype = numpy.float32) #print len(samples), len(responses) knn = cv2.KNearest() knn.train(samples,responses) # retrieve index and value through enumeration for i, descriptor in enumerate(nrows): descriptor = numpy.array(descriptor, dtype = numpy.float32).reshape((1, rowsize)) #print i, descriptor.shape, samples[0].shape retval, results, neigh_resp, dists = knn.find_nearest(descriptor, 1) res, dist = int(results[0][0]), dists[0][0] #print res, dist if dist < 0.1: # draw matched keypoints in red color color = (0, 0, 255) else: # draw unmatched in blue color color = (255, 0, 0) # draw matched key points on haystack image x,y = hkeypoints[res].pt center = (int(x),int(y)) cv2.circle(opencv_haystack,center,2,color,-1) # draw matched key points on needle image x,y = nkeypoints[i].pt center = (int(x),int(y)) cv2.circle(opencv_needle,center,2,color,-1) cv2.imshow(''haystack'',opencv_haystack) cv2.imshow(''needle'',opencv_needle) cv2.waitKey(0) cv2.destroyAllWindows()

Puede descomentar las declaraciones de impresión para tener una mejor idea acerca de las estructuras de datos utilizadas.