OpenCV - Сравнение возможностей SURF - PullRequest
9 голосов
/ 13 ноября 2010

Мне интересно, как сравниваются дескрипторы функций OpenCV. Например, я могу использовать cvExtractSURF(), чтобы получить список функций и их 64-битных (или 128-битных) дескрипторов, где я могу узнать, как можно сравнить два дескриптора?

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

Кто-нибудь когда-нибудь выяснил, как взять два массива дескрипторов и сравнить их?

Гугл не очень помог ...

Cheers, Brett

Ответы [ 4 ]

7 голосов
/ 13 ноября 2010

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

3 голосов
/ 26 февраля 2012

Один эффективный метод, который я нашел (и он основан на некотором примере кода OpenCV), - Используйте k поиск ближайшего соседа с K = 2, чтобы найти 2 совпадения для каждого дескриптора в объекте запроса. теперь, если расстояние (1-е совпадение) <0,6 * расстояние (2-е совпадение), считайте 1-е совпадение «хорошим совпадением». </p>

Причина, по которой вам это нужно и простой поиск ближайших соседей 1 не будет достаточным, заключается в том, что это дает МНОЖЕСТВО ложных срабатываний.

3 голосов
/ 18 ноября 2010

В примере файла OpenCV 2.1 find_obj.cpp представлены два метода:

  • встроенная функция C ++ Flann (фланг дает приблизительное решение и работает быстрее), я не знаю точно, как он работает, но это задокументировано здесь .
  • более простая функция C (findPairs ()), которая находит ближайшего соседа путем вычисления простого евклидова расстояния между дескрипторами (посмотрите на функцию compareSURFDescriptors ()). Лапласиан также может быть использован в качестве первого показателя сходства, поскольку совпадающие точки имеют не один и тот же лапласиан (1 или -1). Этот образец доступен здесь .
2 голосов
/ 13 ноября 2010

SURF - это 64-мерные единичные векторы.Естественным способом сравнения двух векторов признаков является вычисление их точечного произведения.Если оно близко к 1, они имеют сильную положительную корреляцию (= они похожи).Если оно близко к 0, они почти ортогональны (без корреляции).Если оно меньше нуля, они имеют отрицательную корреляцию.В зависимости от вашего приложения вы можете либо считать это совпадением (в этом случае вы бы взяли абсолютное значение точечного произведения), либо считать его хуже ортогонального.

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

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