Описание SURF быстрее с обнаружением FAST?

Для моей магистерской работы я провожу несколько тестов на алгоритмах SIFT SURF en FAST для обнаружения логотипов на смартфонах.

Когда я просто определяю время обнаружения и описания для некоторых методов, я получаю следующие результаты.

Для детектора SURF и дескриптора SURF:

Найдено 180 ключевых точек

  • Время расчета ключевой точки 1,994 секунды (SURF)

  • 4,516 секунд время описания (SURF)

  • Время совпадения 0,282 секунды (SURF)

когда я использую FAST-детектор вместо SURF-детектора

Найдено 319 точек

  • 0,023 секунды время вычисления ключевой точки (FAST)

  • 1,295 секунд время описания (SURF)

  • Время совпадения 0,397 секунды (SURF)

Детектор FAST намного быстрее, чем детектор SURF, и даже обнаруживает почти вдвое больше ключевых точек в 100 раз быстрее. Эти результаты предсказуемы.

Следующий шаг, однако, не является прогнозируемым результатом. Как это возможно, что дескриптор de SURF быстрее с 319 FAST-точками, чем с 180 SURF-точками?

Из того, что я знаю, описание не имеет отношения к алгоритму обнаружения... но эти результаты не такие предсказанные.

Кто-нибудь знает, как это возможно?

вот код:

    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));

1 ответ

Решение

AFAIK самая трудоемкая часть извлечения дескриптора SURF - это субпиксельное извлечение патча, имеющего размер (2.8*keypoint.size x 2.8*keypoint.size) вокруг каждой ключевой точки.

Итак, вот мое предположение: ключевые точки, найденные детектором FAST, всегда имеют свои size равно 7, но детектор SURF может найти ключевые точки гораздо большего размера. Таким образом, 180 "больших" ключевых точек обрабатываются дольше, чем 319 "маленьких".

Другие вопросы по тегам