cv2.matchTemplate(in_img,template,method)
相関値の算出方法(methodで指定)
method: cv2.TM_CCOEFF_NORMED ←ZNCC(Zero-mean Normalized Cross-Correlation)
method: cv2.TM_CCOEFF ←ZCC(Zero-mean Cross-Correlation)
method: cv2.TM_CCORR_NORMED ←NCC(Normalied Cross-Correlation)
method: cv2.TM_CCORRR ←CC(Cross-Correlation)
method: cv2.TM_SQDIFF_NORMED ←SSD(Sum of Squared Difference)
# -*- coding: utf-8 -*-
import cv2
#Ipythonで表示用の設定
import matplotlib.pyplot as plt
%matplotlib inline
#画像読込
in_img = cv2.imread("lena.jpg")
#切り抜き
# 左上(250,230),右下(340,330)の矩形部分を切り抜き
template = in_img[230:330, 250:340]
h = template.shape[0]
w = template.shape[1]
#テンプレートマッチング(正規化相関ZNCC)
res = cv2.matchTemplate(in_img,template,eval("cv2.TM_CCOEFF_NORMED"))
# 一致した部分の位置情報
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
#マッチング位置の左上情報
top_left = max_loc
#マッチング位置の右下情報
bottom_right = (max_loc[0] + w, max_loc[1] + h)
# 一致した部分を矩形で囲む
cv2.rectangle(in_img,top_left, bottom_right, (0,0,255), 2)
disp_template = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)
disp_in_img = cv2.cvtColor(in_img, cv2.COLOR_BGR2RGB)
#画像表示
plt.figure(figsize=(3,3))
plt.subplot(221)
plt.imshow(disp_template)
plt.title("template")
plt.figure(figsize=(12,12))
plt.subplot(223)
plt.imshow(res, cmap="gray")
plt.title("correlation map")
plt.subplot(224)
plt.imshow(disp_in_img)
plt.title("matching position")