Descrição SURF mais rápida com detecção FAST?
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));
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".