[OpenCV-Python] 24 template matching

OpenCV-Python: IV Image Processing in OpenCV

24 template matching

Goals
In this section we will learn:
  1. Use template matching to find a target in an image
  2. Functions: cv2.matchTemplate(), cv2.minMaxLoc()
Principle
  Template matching is used to search and find a template in a large image The method of image location. OpenCV provides us with a function: cv2.matchTemplate(). Like 2D convolution, it also uses the template image to slide on the input image (large image), and compares the template image with its corresponding subregion of the input image at each position. OpenCV provides several different comparison methods (see the documentation for details). The returned result is a grayscale image, and each pixel value represents the matching degree of this area with the template.
If the size of the input image is (WxH) and the size of the template is (wxh), the size of the output result is (W-w+1, H-h+1). After you get this picture, you can use the function cv2.minMaxLoc() to find the positions of the minimum and maximum values. The first value is the point (position) of the upper left corner of the rectangle, (w, h) is the width and height of the moban template rectangle. This rectangle is the template area found.
Note: If the comparison method you use is cv2.TM_SQDIFF, the position corresponding to the minimum value is the matching area.

24.1 Template matching in OpenCV

We have an example here: we search for Messi’s face in Messi’s photos. So we have to make the following template:

Template Image
We will try to use different comparison methods so that we can compare their effects.

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
img2 = img.copy()
template = cv2.imread('messi_face.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 meth in methods:
img = img2.copy()
#exec 语句用来执行储存在字符串或文件中的 Python 语句。
# 例如,我们可以在运行时生成一个包含 Python 代码的字符串,然后使用 exec 语句执行这些语句。
#eval 语句用来计算存储在字符串中的有效 Python 表达式
method = eval(meth)
# Apply template Matching
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 使用不同的比较方法,对结果的解释不同
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right, 255, 2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle(meth)
plt.show()

The result is as follows:
cv2.TM_CCOEFF
Insert picture description here

cv2.TM_CCOEFF_NORMED
Template Image

cv2.TM_CCORR
Template Image
cv2.TM_CCORR_NORMED   
Template Image
 
cv2.TM_SQDIFF    
Template Image

cv2.TM_SQDIFF_NORMED
Template Image
We see that the effect of cv2.TM_CCORR is not as good as we thought.

24.2 Multi-object template matching

In the previous part, we searched for Messi's face in the picture, and Messi only appeared in the picture once. What if your target object only appears in the image many times? The function cv.imMaxLoc() will only give the maximum and minimum values. At this point, we are going to use the threshold.
In the following example, we want to find the coins in a screenshot of the classic game Mario.

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv2.imwrite('res.png',img_rgb)

result:
    img

For more information, please pay attention to the official account:
img

Guess you like

Origin blog.csdn.net/yegeli/article/details/113430971