Сопоставление и сравнение шаблона входного изображения с более крупным изображением — обычная задача в компьютерном зрении, часто используемая для обнаружения и локализации объектов. OpenCV предоставляет различные методы сопоставления и сравнения шаблонов. Один из самых простых методов — использование функции cv2.matchTemplate().

import cv2
import numpy as np

# Load the larger image and the template image
larger_image = cv2.imread('larger_image.jpg')
template = cv2.imread('template_image.jpg')

# Get the dimensions of the template
template_height, template_width = template.shape[:2]

# Perform template matching using cv2.matchTemplate()
result = cv2.matchTemplate(larger_image, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# Determine the coordinates of the matched region
top_left = max_loc
bottom_right = (top_left[0] + template_width, top_left[1] + template_height)

# Draw a rectangle around the matched region on the larger image
cv2.rectangle(larger_image, top_left, bottom_right, (0, 255, 0), 2)

# Display the result
cv2.imshow('Matching Result', larger_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Еще один фрагмент кода, который представляет собой очень простой базовый процесс, позволяющий понять больше…

"""
It is a method for searching and finding the location of a template image 
in a larger image.OpenCV comes with a function cv2.matchTemplate() for this 
purpose. It simply slides the template image over the input image 
(as in 2D convolution) and compares the template and patch of input image 
under the template image. 
"""
import cv2
import numpy as np

img = cv2.imread("C:\\Users\\RANGER\\Desktop\\Computer_Vision_Opencv\\image data\\bess.jpg")

grey_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread("C:\\Users\\RANGER\\Desktop\\Computer_Vision_Opencv\\image data\\bess1.jpg", 0)
w, h = template.shape[::-1]

#this function accept prameters (img,template,method)
res = cv2.matchTemplate(grey_img, template, cv2.TM_CCORR_NORMED)
print("res==",res)
threshold = 0.999
loc = np.where(res >= threshold)  #find brightest point
print("bright pixels==",loc)
count = 0
for i in zip(*loc[::-1]):
    print("i===",i)
    cv2.rectangle(img, i, (i[0] + w, i[1] + h), (0, 0, 255), 2)
    count+=1
print("number of iterations==",count)
img = cv2.resize(img,(800,600))
res = cv2.resize(res,(800,600))
cv2.imshow("img", img)
cv2.imshow("match temp==",res)
cv2.waitKey(0)
cv2.destroyAllWindows()


#Check All Method

"""
img = cv2.imread('H:\\Data\\avengers1.jpg',0)
img2 = img.copy()

template = cv2.imread('H:\\Data\\temp.jpg',0)
w, h = template.shape[::-1]

# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
            'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 
            'cv2.TM_SQDIFF_NORMED']

for i in methods:
    print("i==",i)
    img = img2.copy()
    method = eval(i)
    
    res = cv2.matchTemplate(img,template,method)
    
    threshold = cv2.minMaxLoc(res) #minMax Loc return 4 values
    #getting cordinates from threshold
    x1 = threshold[3]
    
    cv2.rectangle(img, x1,(x1[0]+w,x1[1]+h) , (255, 0, 255), 2)
    
    #result display
    img = cv2.resize(img,(400,600))
    cv2.imshow(i+"img",img)
    res = cv2.resize(res,(400,600))
    cv2.imshow(i+"res",res)

cv2.waitKey(0)
cv2.destroyAllWindows()
"""

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

Выход:…

Вот некоторые краткие сведения об этих методах.

  1. cv2.TM_CCOEFF: этот метод вычисляет коэффициент взаимной корреляции между шаблоном и областью изображения. Он возвращает положительные значения для хороших совпадений и отрицательные значения для плохих совпадений. Чем выше значение, тем лучше совпадение. Однако этот метод чувствителен к изменениям освещенности.
  2. cv2.TM_CCOEFF_NORMED: Подобно cv2.TM_CCOEFF, этот метод вычисляет нормализованный коэффициент взаимной корреляции. Это нормализованная версия коэффициента корреляции, который находится в диапазоне от -1 до 1. Опять же, более высокие значения указывают на лучшее совпадение.
  3. cv2.TM_CCORR: этот метод вычисляет корреляцию между шаблоном и областью изображения. Более высокие значения соответствуют лучшим совпадениям.
  4. cv2.TM_CCORR_NORMED: Подобно cv2.TM_CCORR, этот метод вычисляет нормализованную корреляцию. Он также находится в диапазоне от -1 до 1.
  5. cv2.TM_SQDIFF: этот метод вычисляет квадрат разницы между шаблоном и областью изображения. Более низкие значения указывают на лучшее совпадение.
  6. cv2.TM_SQDIFF_NORMED: Подобно cv2.TM_SQDIFF, этот метод вычисляет нормализованные квадратичные разности. Более низкие значения по-прежнему указывают на лучшее совпадение.

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