Существует множество вариантов оценки подобия для сопоставления с шаблоном в целом. *
OpenCV имеет 3 доступных режима сопоставления шаблонов:
- сумма квадратов разностей (евклидово расстояние)
- Кросс-корреляция
- коэффициент корреляции Пирсона
И в OpenCV каждая из этих трех версий также имеет нормированную / масштабированную версии:
- Нормализованная сумма квадратов разностей
- Нормализованная взаимная корреляция
- Нормализованный коэффициент корреляции Пирсона
Фактические формулы, используемые в документах OpenCV, вы можете найти в TemplateMatchModes , хотя они согласуются с общими формулами, которые можно найти везде для вышеуказанных методов.
Вы можете закодировать соответствующий шаблон вместо использования OpenCV. Тем не менее, обратите внимание, что OpenCV оптимизирован для этих операций и в целом работает быстро при сопоставлении шаблонов. OpenCV использует DFT для выполнения некоторых из этих вычислений, чтобы уменьшить вычислительную нагрузку. Например, см .:
Вы также можете использовать OpenCV minMaxLoc()
, чтобы найти минимальное / максимальное значение вместо того, чтобы проходить через себя. Кроме того, вы не указали способ доступа к своим значениям, но не все методы поиска работают так же быстро, как другие. См. Как сканировать изображения , чтобы увидеть самые быстрые Mat
операции доступа. Спойлер: сырые указатели.
Основное ускорение, которое должна обеспечить оптимизация, - это досрочное прекращение работы функции. Тем не менее, я не думаю, что вы достигнете более быстрых времен в целом, если будете кодировать его самостоятельно, если только нет значительно меньшего подмножества исходного изображения, в котором обычно находится шаблон.
Лучшим методом сокращения времени поиска, если ваши изображения очень большие, будет использование подхода с разрешением по пирамиде. В основном, сделайте шаблон и ищите изображения 1/2 вашего изображения с тех пор, 1/2 от этого, 1/2 от этого и так далее. Затем вы начинаете сопоставление шаблона с небольшим изображением 1/16 или любого другого размера и находите общее местоположение шаблона. Затем вы делаете то же самое для следующего размера изображения, но вы ищете только небольшое подмножество, где ваш шаблон был в предыдущем масштабе. Затем, каждый раз, когда вы увеличиваете размер изображения ближе к оригиналу, вам нужны только небольшие различия в несколько пикселей, чтобы точнее зафиксировать положение. Общее местоположение сначала определяется по наименьшему масштабированному изображению, поиск которого занимает лишь небольшую часть времени по сравнению с исходным размером изображения, а затем вы просто уточняете его путем увеличения.
* Обратите внимание, что OpenCV не включает другие методы сопоставления шаблонов, которые вы можете увидеть в других местах. В частности, OpenCV имеет сумму квадратов, но нет метода абсолютных расстояний. Разности фаз также используются в качестве показателя сходства, но не существуют в OpenCV. В любом случае, взаимная корреляция и сумма разностей квадратов чрезвычайно распространены при обработке изображений, и если у вас нет специальной области изображений, она должна работать нормально.