テンプレートマッチング

V2.4.11, V3.0.0

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)

In [12]:
# -*- 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")
Out[12]:
<matplotlib.text.Text at 0x105f18b0>
inserted by FC2 system