Проблемы производительности при использовании детектора / дескриптора BRISK OpenCV

У меня возникают проблемы с производительностью, когда я использую BRISK для обнаружения и описания функций в OpenCV.

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

против всех дескрипторов, которые я получаю из базы данных изображений, используя сопоставление по флангу с алгоритмом LSH и BRISK для обнаружения и описания функций.

Моя база данных изображений состоит из 242 изображений. На этих 242 изображениях есть три изображения, соответствующие каждому объекту, взятому отдельно в вышеупомянутом «сложном» запросе изображения.

Вот параметры, используемые для обнаружения BRISK (параметры opencv по умолчанию): Порог: 30, Октавы: 4, Масштаб паттерна: 1.0.

После сопоставления по флангу с использованием метода наилучшего совпадения (каждый дескриптор в запросе изображения связан с его ближайшей окрестностью в наборе дескрипторов базы данных), мой алгоритм выводит список изображений базы данных, отсортированный по проценту соответствия. Вот четыре первых результата:

Изображение, соответствующее болту в базе данных: 4 совпадения / 15 обнаруженных ключевых точек => Соответствующий процент:26,7%.Изображение, соответствующее бутылке в базе данных, имеет 4 совпадения / 15 обнаруженных ключевых точек => Соответствующий процент:26,7%.Изображение, соответствующее болту в базе данных, имеет 10 совпадений / 59 обнаруженных ключевых точек => Соответствующий процент:16,9%.Изображение, соответствующее объекту, которого нет в запросе изображения: 1 совпадение / 16 обнаруженных ключевых точек => Соответствующий процент:16,7%.

Я сравнил эти результаты, используя ORB в качестве функции обнаружения и описания. Вот используемые параметры: Количество функций: 2000, Коэффициент масштабирования: 1,2, Количество уровней пирамиды: 8.

Вот результаты, которые я получаю:

Изображение, соответствующее болту в базе данных: 576 совпадений / 752 обнаруженных ключевых точек => Соответствующий процент:76,6%.Изображение, соответствующее бутылке в базе данных, имеет 111 совпадений / 189 обнаруженных ключевых точек => Соответствующий процент:58,7%.Изображение, соответствующее перу в базе данных, имеет 124 совпадения / 293 обнаруженных ключевых точки => Соответствующий процент:42,3%.Изображение, соответствующее объекту, которого нет в запросе изображения: 2 совпадения / 66 обнаруженных ключевых точек => Соответствующий процент:3%.

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

Мне интересно, почему детектор BRISK обнаруживает гораздо меньше ключевых точек, чем детектор ORB. Я сделал разные тесты, чтобы выяснить, как я могу обнаружить больше ключевых точек с помощью детектора BRISK (уменьшить порог, уменьшить октавное число). Я действительно могу обнаружить немного больше ключевых точек, но разница с детектором ORB все еще действительно важна. Есть ли у вас идеи, почему детектор BRISK имеет такое поведение?

Моя версия OpenCV - 2.4.8, но я попробовал часть обнаружения BRISK с 2.4.4 и версией 2.4.9 согласно этим утверждениям:

http://code.opencv.org/issues/2491 а такжеДетектор функций BRISK обнаруживает нулевые ключевые точки без улучшений.

Я также попытался объединить детектор ORB с описанием BRISK. Результаты сопоставления лучше, чем в первом методе (полный BRISK), но хуже, чем во втором (полный ORB):

Изображение, соответствующее болту в базе данных: 529 совпадений / 708 обнаруженных ключевых точек => Соответствующий процент:74,7%.Изображение, соответствующее бутылке в базе данных, имеет 69 совпадений / 134 обнаруженных ключевых точки => Соответствующий процент:51,5%.Изображение, соответствующее перу в базе данных, соответствует 93/247 обнаруженных ключевых точек => Соответствующий процент:37,6%.Изображение, соответствующее объекту, которого нет в запросе изображения: 5 совпадений / 50 обнаруженных ключевых точек => Соответствующий процент:10%.

Обратите внимание, что количество точек, обнаруженных на каждом изображении, не одинаково в методе 2 и методе 3. На самом деле, когда я запускаю этот код на тестовом изображении (здесь изображение болта):

// BRISK parameters
int Threshl=30;
int Octaves=4;
float PatternScales=1.0f;

// ORB parameters
int nFeatures=2000;
float scaleFactor=1.2f;
int nLevels=8;


BRISK  BRISKD(Threshl, Octaves, PatternScales);
ORB ORBD(nFeatures, scaleFactor, nLevels);

vector<KeyPoint> kpts;
Mat descriptors;

Mat img = cv::imread("Path to the bolt image", IMREAD_GRAYSCALE );
ORBD.detect(img,kpts); // Number of keypoints detected = 752
BRISKD.compute(img, kpts, descriptors); // Number of descriptors = 708

Кажется, что BRISK не вычисляет все обнаруженные ключевые точки в дескрипторах (752 ключевых точки, обнаруженных детектором ORB => 708 дескрипторов, вычисленных дескриптором BRISK).

Однако, даже если все ключевые точки, обнаруженные ORB, не вычисляются в дескрипторах BRISK. С этими результатами кажется, что BRISK не лучше описать ключевую точку, чем ORB? Поправьте меня, если я ошибаюсь, но я уверен, что должно быть наоборот ...

Если у вас, ребята, есть какой-то элемент, который мог бы помочь мне понять мои результаты, или если у вас уже были некоторые проблемы с BRISK в OpenCV, пожалуйста, дайте мне знать. Любая помощь будет принята с благодарностью :).

Ответы на вопрос(1)

Ваш ответ на вопрос