2012-05-21 13 views
7

per la mia tesi di laurea, sto eseguendo alcuni test sugli algoritmi SIFT SURF en FAST per il rilevamento del logo su smartphone.Descrizione SURF più veloce con rilevamento FAST?

quando ho semplicemente il tempo del rilevamento, la descrizione e la corrispondenza per alcuni metodi ottengono i seguenti risultati.

Per un rilevatore SURF e SURF Descrittore:

180 keypoints trovato

  • 1994 secondo keypoint tempo di calcolo (SURF) descrizione

  • 4.516 secondi Tempo (SURF)

  • 0,282 secondi di tempo corrispondente (SURF)

quando uso un sensore veloce al posto del rivelatore SURF

319 keypoints trovato

  • 0.023 secondi di tempo di calcolo keypoint (FAST)

  • 1,295 secondi descrizione orario (SURF)

  • 0,397 secondi di tempo corrispondente (SURF)

Il rilevatore FAST è molto più veloce del rilevatore SURF e rileva anche quasi il doppio dei keypoints 100 volte più velocemente. Questi risultati sono prevedibili.

Il passaggio successivo non è un risultato previsto. Com'è possibile che il descrittore de SURF sia più veloce con i 319 punti chiave FAST e poi con i 180 punti chiave SURF?

Da quello che so, la descrizione non ha alcuna relazione con l'algoritmo di rilevamento ... eppure questi risultati non sono come previsto.

qualcuno sa come è possibile?

ecco il codice:

FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF); 
    //FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST); 
    Imgproc.cvtColor(image1, image1, Imgproc.COLOR_RGBA2RGB); 
    Imgproc.cvtColor(image2, image2, Imgproc.COLOR_RGBA2RGB); 

    DescriptorExtractor SurfExtractor = DescriptorExtractor 
    .create(DescriptorExtractor.SURF); 


    //extract keypoints 
    long time= System.currentTimeMillis(); 
    detector.detect(image1, keypoints); 
    Log.d("LOG!", "number of query Keypoints= " + keypoints.size()); 
    detector.detect(image2, logoKeypoints); 
    Log.d("LOG!", "number of logo Keypoints= " + logoKeypoints.size()); 
    Log.d("LOG!", "keypoint calculation time elapsed" + (System.currentTimeMillis() -time)); 

    //Descript keypoints 
    long time2 = System.currentTimeMillis(); 
    Mat descriptors = new Mat(); 
    Mat logoDescriptors = new Mat(); 
    Log.d("LOG!", "logo type" + image2.type() + " intype" + image1.type()); 
    SurfExtractor.compute(image1, keypoints, descriptors); 
    SurfExtractor.compute(image2, logoKeypoints, logoDescriptors); 
    Log.d("LOG!", "Description time elapsed" + (System.currentTimeMillis()- time2)); 
+0

potresti inserire un po 'del tuo codice? :) – Codeman

+0

parte del mio codice è stata aggiunta alla domanda! – piepie

risposta

7

per quanto ne so la maggior parte in termini di tempo di estrazione del descrittore Surf è l'estrazione subpixel di patch di avere (2.8 * 2.8 * keypoint.size x keypoint.size) formato intorno alla ogni punto chiave .

Quindi ecco la mia ipotesi: i punti chiave rilevati dal rivelatore FAST hanno sempre il loro size uguale a 7 ma il rilevatore SURF può trovare punti chiave di dimensioni molto più grandi. Quindi 180 punti chiave "grandi" vengono elaborati più a lungo di 319 "piccoli".

+1

Ho elaborato il descrittore SIFT ma non ho descritto completamente il descrittore SURF nella mia tesi, forse se l'avessi fatto, avrei saputo questo. La tua spiegazione sembra molto ragionevole e penso che questa possa essere la risposta giusta alla mia domanda! grazie! – piepie