2012-05-21 6 views
7

Für meine Diplomarbeit führe ich einen Test mit den SIFT SURF en FAST Algorithmen zur Logoerkennung auf Smartphones durch.SURF-Beschreibung schneller mit FAST-Erkennung?

Wenn ich einfach die Erkennung, Beschreibung und die Übereinstimmung für einige Methoden bekomme, bekomme ich die folgenden Ergebnisse.

Für einen SURF Detektor und SURF Deskriptors:

180 keypoints gefunden

  • 1.994 Sekunden lang keypoint Berechnungszeit (SURF)

  • 4.516 Sekunden Beschreibung Zeit (SURF)

  • 0,282 Sekunden Anpassungszeit (SURF)

wenn ich einen schnellen Detektor anstelle des Detektors SURF verwenden

319 keypoints

gefunden
  • 0,023 Sekunden lang keypoint Berechnungszeit (FAST)

  • 1,295 Sekunden Beschreibung Zeit (SURF)

  • 0,397 Sekunden lang passende Zeit (SURF)

Der FAST-Detektor ist viel schneller als der SURF-Detektor und erkennt sogar fast doppelt so viele Schlüsselpunkte 100-mal schneller. Diese Ergebnisse sind vorhersehbar.

Der nächste Schritt ist jedoch kein vorhergesagtes Ergebnis. Wie ist es möglich, dass der SURF-Deskriptor mit den 319 FAST-Schlüsselpunkten schneller ist als mit den 180 SURF-Schlüsselpunkten?

Von dem, was ich weiß, hat die Beschreibung keine Beziehung mit dem Erkennungsalgorithmus ... noch sind diese Ergebnisse nicht wie vorhergesagt.

weiß jemand wie das möglich ist?

hier ist der Code:

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

Könnten Sie bitte etwas von Ihrem Code posten? :) – Codeman

+0

einige meiner Code ist der Frage hinzugefügt! – piepie

Antwort

7

AFAIK die meiste Zeit des SURF-Descriptor Extraktion Subpixel Extraktion von Patch mit (2,8 * keypoint.size x 2,8 * keypoint.size) Größe rund um die jedem Schlüsselpunkt aufwendigste Teil .

Also hier ist meine Vermutung: Schlüsselpunkte von FAST-Detektor gefunden haben immer ihre size gleich 7 aber SURF-Detektor kann Schlüsselpunkte viel größere Größe finden. So werden 180 "große" Schlüsselpunkte länger als 319 "klein" verarbeitet.

+1

Ich habe den SIFT-Deskriptor ausgearbeitet, aber den SURF-Deskriptor in meiner These nicht vollständig beschrieben, vielleicht hätte ich das gewusst, wenn ich es getan hätte. Ihre Erklärung scheint sehr vernünftig und ich denke, dass dies die richtige Antwort auf meine Frage sein kann! danke! – piepie