Pergunta

para minha tese de mestrado, estou realizando alguns testes nos algoritmos SIFT SURF e FAST para detecção de logotipo em smartphones.

quando simplesmente cronometro a detecção, descrição e correspondência para alguns métodos, obtenho os seguintes resultados.

Para um detector SURF e um descritor SURF:

180 pontos-chave encontrados

  • Tempo de cálculo do ponto-chave de 1.994 segundos (SURF)

  • Tempo de descrição de 4.516 segundos (SURF)

  • Tempo de correspondência de 0,282 segundos (SURF)

quando uso um detector FAST em vez do detector SURF

319 pontos-chave encontrados

  • Tempo de cálculo do ponto-chave de 0,023 segundos (RÁPIDO)

  • Tempo de descrição de 1,295 segundos (SURF)

  • Tempo de correspondência de 0,397 segundos (SURF)

O detector FAST é muito mais rápido que o detector SURF e até detecta quase o dobro de pontos-chave 100 vezes mais rápido.Esses resultados são previsíveis.

O próximo passo, porém, não é um resultado previsto.Como é possível que o descritor SURF seja mais rápido com os 319 pontos-chave FAST do que com os 180 pontos-chave SURF?

Pelo que sei, a descrição não tem relação com o algoritmo de detecção...no entanto, esses resultados não são os previstos.

alguém sabe como isso é possível?

aqui está o código:

    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));
Foi útil?

Solução

AFAIK, a parte mais demorada da extração do descritor SURF é a extração de subpixel do patch com tamanho (2,8 * keypoint.size x 2,8 * keypoint.size) em torno de cada ponto-chave.

Então aqui está meu palpite:pontos-chave encontrados pelo detector FAST sempre têm seus size igual a 7, mas o detector SURF pode encontrar pontos-chave de tamanho muito maior.Portanto, 180 pontos-chave "grandes" são processados ​​por mais tempo do que 319 "pequenos".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top