Почему средство сопоставления дескрипторов на основе Фланна каждый раз соответствует разным ключевым точкам?

#android #opencv #surf

#Android #opencv #серфинг

Вопрос:

Это нормально? Когда я пробовал средство сопоставления методом перебора, результат каждый раз был одинаковым, а фланн — нет. Небольшое количество ключевых точек будет соответствовать разным местам. Я пишу код, используя оболочку Android, детектор ключевых точек и дескриптор — SURF, что-то вроде этого:

 Mat queryDescriptors = new Mat();
Mat trainDescriptors = new Mat();
DescriptorExtractor surfDE = DescriptorExtractor.create(DescriptorExtractor.SURF);
surfDE.compute(queryImage, queryKeyPoints, queryDescriptors);
surfDE.compute(trainImage, trainKeyPoints, trainDescriptors);
DescriptorMatcher dm = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);
List<DMatch> matches = new ArrayList<DMatch>();
dm.match(queryDescriptors, trainDescriptors, matches);
  

Комментарии:

1. Строка DescriptorMatcher.create выдает ошибку

Ответ №1:

FLANN расшифровывается как Быстрая библиотека для приблизительных ближайших соседей. Приближенные алгоритмы ближайшего соседа являются недетерминированными, часто рандомизированными KD-деревьями.

Комментарии:

1. Вы можете исправить начальное значение с помощью cv::setRNGSeed(2391); перед каждым использованием FLANN. Обратите внимание, что это не будет надежно работать, если вы используете ФЛАНН из нескольких потоков одновременно.

Ответ №2:

По словам Андрея, в этом причина! Так что да, это нормально. Чтобы найти больше, нужно было бы проанализировать алгоритмы!