OpenCV: изображение отпечатка пальца и сравнение с базой данных

У меня есть база данных изображений. Когда я беру новое изображение, , я хочу сравнить его с изображениями в этой базе данных и получить оценку сходства (используя OpenCV). Таким образом, я хочу обнаружить, если у меня есть изображение, которое очень похоже на свежую картину.

Можно ли создать отпечаток пальца/хэш моих изображений базы данных и сопоставить с ним новые?

Я ищу фрагмент кода алогрима или техническую демонстрацию, а не коммерческое решение.

Бест,

Стефан

Ответ 1

Как прокомментировал Pual R, этот "отпечаток/хэш" обычно представляет собой набор векторов признаков или набор дескрипторов функций. Но большинство векторных векторов, используемых в компьютерном зрении, обычно слишком дорогостоящие вычисления для поиска по базе данных. Поэтому для этой задачи требуется специальный вид дескрипторов функций, поскольку такие дескрипторы, как SURF и SIFT, занимают слишком много времени для поиска даже при различных оптимизации.

Единственная вещь, которую OpenCV имеет для вашей задачи (категоризация объектов) - это реализация Сумки визуальных слов (BOW).

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

Вот документация OpenCV для мешка слов. Также OpenCV имеет образец с именем bagofwords_classification.cpp. Это действительно большой, но может быть полезным.

Ответ 2

Системы поиска изображений на основе контента по-прежнему являются областью активных исследований: http://citeseerx.ist.psu.edu/search?q=content-based+image+retrieval

Сначала вы должны быть понятны, что похоже на ваш контекст:

  • Подобное распределение цветов: используйте что-то вроде цветовых дескрипторов для разделов изображения, вы должны получить довольно удовлетворительные результаты.
  • Аналогичные объекты: поскольку компьютер не знает, что такое объект, вы не получите очень далеко, если у вас нет обширных знаний о объекте (или нескольких классов объектов). Хороший обзор текущего состояния исследования можно увидеть здесь (results) и вскоре здесь.

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

Это был бы хороший вопрос для computer-vision.stackexchange.com, если он уже существовал.

Ответ 3

Вы можете использовать pHash Algorithm и сохранить pHash значение в базе данных, а затем использовать этот код:

double const mismatch = algo->compare(image1Hash, image2Hash);

Здесь значение "несоответствие" может легко рассказать о соотношении подобия между двумя изображениями.

Функция pHash:

  • AverageHash
  • PHASH
  • MarrHildrethHash
  • RadialVarianceHash
  • BlockMeanHash
  • BlockMeanHash
  • ColorMomentHash

Эти функции достаточно хороши для оценки сходства изображений во всех аспектах.