Эффективный способ сопоставления дескрипторов SIFT

есть 2 изображения A и B. я извлекаю из них ключевые точки (a[i] и b[i]).
Интересно, как я могу эффективно определить соответствие между a[i] и b[j]?

очевидный метод приходит ко мне, чтобы сравнить каждую точку в A с каждой точкой в B. Но это занимает много времени для больших баз данных изображений. Как я могу просто сравнить точку a[i] только с b[k], где k имеет малый диапазон?

Я слышал, что KD-дерево может быть хороший выбор, не так ли? Есть там любой примеры о KD-дерево?

какие-то другие предложения?

3 ответов


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

С OpenCV действительно легко использовать KD-tree, я приведу вам пример для flann matcher:

flann::GenericIndex< cvflann::L2<int> >  *tree; // the flann searching tree
tree = new flann::GenericIndex< cvflann::L2<int> >(descriptors, cvflann::KDTreeIndexParams(4)); // a 4 k-d tree

затем, когда вы делаете совпадений:

const cvflann::SearchParams params(32);
tree.knnSearch(queryDescriptors, indices, dists, 2, cvflann::SearchParams(8));

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

Если вы хотите определить соответствие, то я боюсь, что вам придется перебирать все возможные пары дескрипторов между двумя изображениями (есть несколько более продвинутых методов, таких как FLANN - Fast Approximate Nearest Neighbor Search, но ускорение не является значительным, если у вас меньше или вокруг 2000 точек на изображении-по крайней мере по моему опыту). Чтобы получить более точное соответствие (не быстрее, просто лучше спички), я могу предложить вам взглянуть на:

Если, с другой стороны, вы хотите только в меру подобия по большой база данных, тогда подходящим местом для начала было бы:


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