2012-09-19 6 views
17

Sto sviluppando un'applicazione che prevede l'uso dei descrittori Freak, appena rilasciata nella versione OpenCV2.4.2.OpenCV FREAK: descrittore Fast Retina KeyPoint

Negli documentation solo due funzioni compaiono:

  • Il costruttore della classe

  • Metodo confusione selectPairs()

voglio usare il mio rivelatore e quindi chiamare il FREAK descrittore che passa i keypoints rilevati ma non capisco chiaramente come funziona la classe.

Domanda:

faccio a strettamente bisogno di usare selectPairs()? Basta chiamare il numero FREAK.compute()? Non capisco davvero quale sia l'uso di selectPairs.

risposta

18

Basta sfogliare il foglio e visto nel paragrafo 4.2 che gli autori hanno impostato un metodo per selezionare le coppie di campi ricettivi valutare nel loro descrittore, in quanto prendere tutte le coppie possibili sarebbe troppo pesante. La funzione selectPairs() ti consente di ricalcolare questo insieme di coppie.

Leggere in seguito la documentazione in cui indicano esattamente questo paragrafo nell'articolo originale. Inoltre, alcuni commenti nella documentazione indicano che esiste un gruppo di coppie apprese non disponibili, già disponibile, pronto per l'uso con il descrittore FREAK. Quindi suppongo almeno che per iniziare potresti utilizzare solo le coppie precalcolate e passare come argomento l'elenco di KeyPoint che hai ottenuto dal tuo metodo su FREAK.compute.

Se i risultati sono deludenti, è possibile provare il metodo di selezione dei punti chiave utilizzato nel documento originale (paragrafo 2.1), quindi in definitiva l'apprendimento del proprio insieme di coppie.

+0

Sì, ho indovinato che era qualcosa del genere. Quello che non so è la necessità di usare un rilevatore per i punti chiave se hai un algoritmo per selezionare le coppie. Questo non è abbastanza chiaro per me sul giornale. Sto sviluppando un pyrFAST con freak e vedrò cosa succede. –

+1

La mia comprensione è che, dato un punto chiave (ad esempio usando pyrFAST), il descrittore è calcolato come il segno della differenza tra coppie di punti (! = Il punto chiave) in un piccolo intorno a questo punto chiave. Questo è molto simile a BREVE se hai familiarità con esso. Ma FREAK ha un metodo che campiona le posizioni nel quartiere ispirate al sistema di visione umano. – remi

+0

Ok, questo ha più senso per me. Sì, conosco BRIEF (che campiona posizioni casuali) e BRISK che campiona in cerchi. I campioni FREAK sono anche in cerchi, ma sono ridondanti e grossolani come la retina. Che non ho notato è che questo è fatto in prossimità di un keypoint, che ha un punto. Grazie! –

16
#include "iostream" 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include "cv.h" 
#include "highgui.h" 
#include <opencv2/nonfree/nonfree.hpp> 
#include <opencv2/nonfree/features2d.hpp> 
#include <opencv2/flann/flann.hpp> 
#include <opencv2/legacy/legacy.hpp> 
#include <vector> 


using namespace cv; 
using namespace std; 

int main() 
{ 
    Mat image1,image2; 
    image1 = imread("C:\\lena.jpg",0); 
    image2 = imread("C:\\lena1.bmp",0); 

    vector<KeyPoint> keypointsA,keypointsB; 
    Mat descriptorsA,descriptorsB; 

    std::vector<DMatch> matches; 

    OrbFeatureDetector detector(400); 

    FREAK extractor; 

    BruteForceMatcher<Hamming> matcher; 

    detector.detect(image1,keypointsA); 
    detector.detect(image2,keypointsB); 

    extractor.compute(image1,keypointsA,descriptorsA); 
    extractor.compute(image2,keypointsB,descriptorsB); 

    matcher.match(descriptorsA, descriptorsB, matches); 

    int nofmatches = 30; 
    nth_element(matches.begin(),matches.begin()+nofmatches,matches.end()); 
    matches.erase(matches.begin()+nofmatches+1,matches.end()); 

    Mat imgMatch; 
    drawMatches(image1, keypointsA, image2, keypointsB, matches, imgMatch); 

    imshow("matches", imgMatch); 
    waitKey(0); 

    return 0; 
} 

questa è una semplice applicazione per corrispondere punti in due immagini ... ho usato Globo per rilevare punti chiave e FREAK come descrittore su quei punti chiave ... poi brutforcematching per rilevare i punti corrispondenti in due immagini .. Ho preso i migliori 30 punti che si adattano meglio ... spero che questo ti aiuti un po '...