2014-05-14 18 views
5

Si verifica un problema di prestazioni quando utilizzo BRISK per il rilevamento e la descrizione delle funzioni in OpenCV.Problemi di prestazioni con il rivelatore/descrittore BRISK OpenCV

Fondamentalmente cerco di abbinare tutti i descrittori che ricevo da questa immagine: enter image description here

contro tutti i descrittori che ricevo da un database di immagini utilizzando Flann matcher base con l'algoritmo LSH e veloce per il rilevamento funzione e la descrizione.

Il mio database di immagini è composto da 242 immagini. In queste 242 immagini ci sono tre immagini corrispondenti a ciascun oggetto prese separatamente nella suddetta query immagine "complessa".

Ecco i parametri utilizzati per il rilevamento BRISK (parametri opencv predefiniti): Treshold: 30, Ottave: 4, Scala pattern: 1.0.

Dopo la corrispondenza del flann utilizzando la tecnica di corrispondenza migliore (ciascun descrittore nella query immagine è associato al suo vicinato più vicino nell'insieme di descrittori del database), il mio algoritmo restituisce l'elenco delle immagini del database ordinate in base alla percentuale di corrispondenza. Ecco i quattro primi risultati:

  1. immagine corrispondente al bullone nel database: 4 partite/15 rilevate keypoints => percentuale corrispondente: 26,7%.
  2. Immagine corrispondente alla bottiglia nel database ha 4 corrispondenze/15 punti chiave rilevati => Percentuale di corrispondenza: 26,7%.
  3. Immagine corrispondente al bullone nel database ha 10 corrispondenze/59 punti chiave rilevati => Percentuale di corrispondenza: 16,9%.
  4. Immagine corrispondente a un oggetto non presente nella query immagine: 1 corrispondenza/16 punti chiave rilevati => percentuale corrispondente: 16,7%.

Ho confrontato questi risultati utilizzando ORB come rilevamento e descrizione delle funzioni. Qui ci sono i parametri utilizzati: Numero di caratteristiche: 2000, Fattore di scala: 1.2, Numero livelli della piramide: 8.

Ecco i risultati che ottengo:

  1. immagine corrispondente al bullone nel database: 576 partite/752 punti chiave rilevati => percentuale corrispondente: 76,6%.
  2. Immagine corrispondente alla bottiglia nel database ha 111 corrispondenze/189 punti chiave rilevati => Percentuale di corrispondenza: 58,7%.
  3. Immagine corrispondente alla penna nel database ha 124 corrispondenze/293 punti chiave rilevati => Percentuale di corrispondenza: 42,3%.
  4. Immagine corrispondente a un oggetto che non è presente nella query di immagine: 2 corrispondenze/66 punti chiave rilevati => Percentuale di corrispondenza: 3%.

Come potete vedere i risultati sono molto meglio con ORB. Innanzitutto ci sono più punti chiave rilevati su ciascuna immagine nel database e la percentuale di corrispondenza è significativamente migliore per gli oggetti buoni.Inoltre, il divario tra la percentuale di corrispondenza per gli oggetti buoni e la percentuale di corrispondenza per gli oggetti sbagliati è più significativo.

Mi chiedo perché il rilevatore BRISK rileva molto meno punti chiave rispetto al rilevatore ORB. Ho fatto diversi test per capire come ho potuto rilevare più punti chiave con il rivelatore BRISK (diminuire la soglia, diminuire il numero di ottava). Posso effettivamente rilevare un po 'più di punti chiave, ma la differenza con il rilevatore ORB è ancora molto importante. Hai idea del perché il rivelatore BRISK abbia un comportamento del genere?

La mia versione OpenCV è 2.4.8, ma ho provato la parte di rilevamento BRISK con la 2.4.4 e la versione 2.4.9 in base a queste affermazioni:

http://code.opencv.org/issues/2491 e BRISK feature detector detects zero keypoints senza miglioramenti.

Ho anche provato a combinare il rilevatore di ORB con la descrizione BRISK. Risultati corrispondenza sono migliori rispetto al primo metodo (full BRISK) ma peggio il secondo (full ORB):

  1. immagine corrispondente al bullone nel database: 529 abbinamento/708 rilevate keypoints => percentuale di corrispondenza: 74,7%.
  2. Immagine corrispondente alla bottiglia nel database ha 69 corrispondenze/134 punti chiave rilevati => Percentuale di corrispondenza: 51,5%.
  3. Immagine corrispondente alla penna nel database corrisponde a 93/247 punti chiave rilevati => Percentuale di corrispondenza: 37,6%.
  4. Immagine corrispondente a un oggetto non presente nella query di immagine: 5 corrispondenze/50 punti chiave rilevati => Percentuale di corrispondenza: 10%.

noti che il numero di punti chiave identificati su ogni immagine non è la stessa nel metodo 2 e 3. Metodo realtà quando si esegue questo codice un'immagine di prova (qui l'immagine del bullone) on:

// BRISK parameters 
int Threshl=30; 
int Octaves=4; 
float PatternScales=1.0f; 

// ORB parameters 
int nFeatures=2000; 
float scaleFactor=1.2f; 
int nLevels=8; 


BRISK BRISKD(Threshl, Octaves, PatternScales); 
ORB ORBD(nFeatures, scaleFactor, nLevels); 

vector<KeyPoint> kpts; 
Mat descriptors; 

Mat img = cv::imread("Path to the bolt image", IMREAD_GRAYSCALE); 
ORBD.detect(img,kpts); // Number of keypoints detected = 752 
BRISKD.compute(img, kpts, descriptors); // Number of descriptors = 708 

BRISK sembra non calcolare tutti i punti chiave rilevati nei descrittori (752 punti chiave rilevati dal rivelatore ORB => 708 descrittori calcolati dal descrittore BRISK).

Tuttavia, anche se tutti i punti chiave rilevati da ORB non sono calcolati nei descrittori BRISK. Con questi risultati sembra che BRISK non sia migliore per descrivere un punto chiave di ORB? Correggimi se ho torto ma sono abbastanza sicuro che dovrebbe essere il contrario ...

Se avete qualche elemento che potrebbe aiutarmi a capire i miei risultati o se avete già avuto qualche problema con BRISK in OpenCV Per favore mi faccia sapere. Qualsiasi aiuto sarebbe molto apprezzato :).

risposta

8

Ok ho capito come ottenere i risultati che mi aspettavo da BRISK. Ho provato il codice da parte del creatore BRISK qui: https://github.com/calihem/mavhub/tree/master/thirdparty

Ecco i risultati che ottengo:

  1. immagine corrispondente al bullone nel database: 149 partite/288 rilevati punti chiave => percentuale corrispondente: 51,7%.
  2. Immagine corrispondente alla bottiglia nel database ha 27 corrispondenze/57 punti chiave rilevati => Percentuale di corrispondenza: 47,4%.
  3. Immagine corrispondente alla penna nel database ha 38 corrispondenze/101 punti chiave rilevati => Percentuale di corrispondenza: 37,6%.
  4. Immagine corrispondente a un oggetto non presente nell'interrogazione dell'immagine: 5 corrispondenze/76 punti chiave rilevati => Percentuale di corrispondenza: 6,6%.

Questi risultati sono molto migliori di quelli che avevo prima. In realtà non sono migliori di quelli ottenuti con ORB per questa specifica immagine di query. Comunque ho provato con altre immagini di query, specialmente immagini più complesse e BRISK ha prestazioni migliori rispetto a ORB.

Sembra che ci sia un problema con l'implementazione di BRISK in opencv almeno dalla versione 2.4.4 fino alla versione corrente 2.4.9. Penso che questo bug dovrebbe essere risolto presto perché è stato segnalato alla community di opencv (http://code.opencv.org/issues/2491).

Nel frattempo ti consiglio di utilizzare il codice scritto dal creatore BRISK che funziona bene;).

+1

grazie per aver fornito una risposta al tuo problema! – Apolo

+0

Hai eseguito il codice BRISK originale da OpenCV o esternamente? –

+3

Ho eseguito il codice originale di Brisk da qui: https://github.com/rghunter/BRISK Nota per utilizzare questo codice è necessario disporre di OpenCV 2.2 o versione successiva. Dovresti essere in grado di eseguire il codice originale di Brisk da OpenCV, ma per prima cosa devi trovare la versione OpenCV in cui il codice Brisk ha funzionato ... Da qualche parte tra 2.2 e 2.4.4. – Maximus