2012-05-21 12 views
7

dla mojej pracy magisterskiej, przeprowadzam test na algorytmach SIFF SURF i FAST do wykrywania logo na smartfonach.Opis SURF szybciej dzięki funkcji FAST detection?

kiedy po prostu czas wykrywania, opis en pasujące do niektórych metod otrzymuję następujące wyniki.

dla czujnika KIPIEL i fale deskryptora:

180 keypoints znaleziono

  • 1994 sekunda KeyPoint czas obliczeń (KIPIEL)

  • 4.516 sekundy Czas opis (KIPIEL)

  • 0,282 sekundy odpowiadający czas (SURF)

podczas korzystania szybki detektor zamiast detektora SURF

319 keypoints znaleziono

  • 0,023 sekundy KEYPOINT czas obliczeń (FAST)

  • 1,295 sekund Funkcja czasu (KIPIEL)

  • 0.397 sekund odpowiadający czas (SURF)

Czujnik FAST jest znacznie szybszy niż detektor SURF, a nawet wykrywa prawie dwukrotnie więcej punktów kluczowych 100 razy szybciej. Te wyniki są przewidywalne.

Następny krok nie jest jednak wynikiem przewidywanym. Jak to możliwe, że deskryptor de SURF jest szybszy z 319 FASTami, a następnie z punktami 180 SURF?

Z tego, co wiem, opis nie ma związku z algorytmem detekcji ... jednak wyniki te nie są zgodne z przewidywaniami.

czy ktoś wie, jak to jest możliwe?

o kod:

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

Czy możesz opublikować część swojego kodu? :) – Codeman

+0

niektóre z mojego kodu są dodawane do pytania! – piepie

Odpowiedz

7

AFAIK najbardziej czasochłonnych części ekstrakcji deskryptora Surf ekstrakcji subpiksel plastra o (2,8 * x 2,8 * keypoint.size keypoint.size) wielkość po każdym KEYPOINT .

Oto moje przypuszczenie: punkty kluczowe wykryte przez wykrywacz FAST zawsze mają swoje size równe 7, ale detektor SURF może znaleźć punkty o znacznie większym rozmiarze. Tak więc 180 "dużych" punktów jest przetwarzanych dłużej niż 319 "małych".

+1

Opracowałem deskryptor SIFT, ale nie w pełni opisałem deskryptor SURF w mojej pracy magisterskiej, może gdybym to zrobił, wiedziałbym o tym. Twoje wyjaśnienie wydaje się bardzo rozsądne i myślę, że to może być właściwa odpowiedź na moje pytanie! dziękuję! – piepie