Метод сравнения изображений с C++ и OpenCV

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


person user1421108    schedule 28.05.2012    source источник


Ответы (2)


Сравнение изображений можно проводить разными способами в зависимости от того, какую цель вы преследуете:

  • если вы просто хотите сравнить, являются ли два изображения примерно одинаковыми (с небольшими различиями в яркости), но с одинаковой перспективой и видом камеры, вы можете просто вычислить квадратную разницу между пикселями для каждой цветовой полосы. Если сумма квадратов на двух изображениях меньше порогового значения, изображения совпадают, в противном случае — нет.
  • Если одно изображение является черно-белым вариантом другого, необходимо преобразовать цветные изображения (см., например, http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale). После этого просто выполните шаг выше.
  • Если одно изображение является частью другого, необходимо выполнить регистрацию двух изображений. Это означает определение масштаба, возможного поворота и XY-сдвига, которые необходимы для наложения части изображения на большее изображение (методы регистрации изображений см.: Pluim, JPW, Maintz, JBA, Viergever, MA, Регистрация на основе взаимной информации. медицинских изображений: обзор, IEEE Transactions on Medical Imaging, 2003, том 22, выпуск 8, стр. 986–1004)
  • Если у вас есть различия в перспективе, вам нужен алгоритм для исправления перекоса одного изображения, чтобы оно как можно лучше соответствовало другому. Способы устранения перекоса см., например, в http://javaanpr.sourceforge.net/anpr.pdf со страницы 15 и далее.

Удачи!

person user1391128    schedule 28.05.2012

Вы должны попробовать СИФТ. Вы применяете SIFT к своему маркеру (изображение, сохраненное в памяти), и вы получаете некоторые дескрипторы (точки, надежные для распознавания). Затем вы можете использовать алгоритм FAST с кадрами камеры, чтобы найти соответствующие ключевые точки маркера на изображении камеры. У вас много тем на эту тему:

Как получить прямоугольник вокруг целевого объекта с использованием функций, извлеченных SIFT в OpenCV

Как искать объект на изображении с SIFT и OpenCV?

OpenCV — сопоставление объектов с использованием дескрипторов SURF и BruteForceMatcher

Удачи

person Jav_Rock    schedule 28.05.2012
comment
Спасибо за ваш ответ. но я не думаю, что это сработает для очень маленьких отличий.. предположим, что исходное изображение содержит две машины... и сравниваемое изображение также содержит две одинаковые машины... но одна из машин имеет знак красного креста.. он не может обнаружить это - person user1421108; 28.05.2012
comment
конечно может. SIFT обнаруживает углы, те точки, которые легко распознать в любом масштабе, любой перспективе, вверх ногами и т. д. Я использовал его с загроможденными изображениями, и он работает действительно очень хорошо. Это современный детектор, а также быстрый. Просто попробуйте. Что может быть сложнее обнаружить, чем изображение зеленой травы на траве. У SIFT нет проблем - person Jav_Rock; 28.05.2012
comment
Я пробовал сравнение с использованием дескрипторов SIFT и FlannBasedMatcher, но он не может обнаружить необычную часть изображения... одним словом, он просто обнаруживает, что оба изображения одинаковы. Большое спасибо. - person user1421108; 30.05.2012