Confronta Immagine vs banca dati di immagini utilizzando SURF e FLANN

voti
0

Sto cercando di confrontare una singola immagine vs un database di immagini.
Attualmente sto usando Python 2.7 e OpenCV 3.3.0.
Dopo un po 'googling, vengo con questo codice:

scanned = 'tests/temp_bw.png'
surf = cv2.xfeatures2d.SURF_create(400)
surf.setUpright(True)

img1 = cv2.imread(scanned, 0)
kp1, des1 = surf.detectAndCompute(img1, None)

FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)

flann = cv2.FlannBasedMatcher(index_params, search_params)

for filename in os.listdir('images'):
    img2 = cv2.imread('images/' + filename, 0)
    kp2, des2 = surf.detectAndCompute(img2, None)
    flann.add([des2])

print str(len(flann.getTrainDescriptors()))

print Training...
flann.train()

print Matching...
indexes, matches = flann.knnSearch(des1, 2, params={})

Il problema principale è che in OpenCV 3.3.0 del FlannBasedMatchernon ha un metodo knnSearch. Ho controllato la documentazione del codice e nella 2.4 tale metodo era lì, ora è stato rimosso.

C'è qualcosa di simile in OpenCV 3.3.0?
O devo usare un approccio diverso?

È pubblicato 28/09/2017 alle 14:36
dall'utente
In altre lingue...                            


1 risposte

voti
1

In OpenCV 3.3.0 è detta funzione knnMatch

Esempio di utilizzo può essere trovato in questa pagina sotto Matcher basato FLANN: http://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html


Edit: Scusa, mi rendo conto ora che ho capito male. La knnSearchfunzione è ora sotto flann.Index(), e può essere utilizzato come segue. Assicurarsi che il database dei descrittori e l'oggetto di query sono entrambi float32

flann = cv2.flann.Index()
print "Training..."
flann.build(des_all, index_params)
print "Matching..."
indexes, matches = flann.knnSearch(des1, 2)
Risposto il 28/09/2017 a 15:04
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more