Lesson 5 Quiz Find Template 2D: 画像を使ったテンプレートマッチング OpenCV
Lesson 5、Quiz その2。画像でのtemplateマッチング。
import cv2
import numpy as np
from matplotlib import pyplot as plt
def find_template_2D(template, img):
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
temp_h, temp_w = template.shape[:2]
bottom_pt = (max_loc[0]+temp_w, max_loc[1]+temp_h)
border_width = 20
cv2.rectangle(img, max_loc, bottom_pt, 255, border_width)
plt.subplot(222), plt.imshow(img, 'gray')
plt.subplot(223), plt.imshow(template, 'gray')
plt.subplot(224), plt.imshow(result, 'gray')
return max_loc
# load images
img = cv2.imread('IMG_09712.jpg', 0)
cropped_img = img[2600:3000, 1000:1500]
result = find_template_2D(cropped_img, img)
plt.show()
実行結果は下記。サザンカの花びらの部分を探しました。元データにマッチングで見つかった部分を四角で示してあります。元データには花びらが何枚もありますが、ちゃんとテンプレートに指定した花びらが一番マッチしています(マッチング結果である3枚目では、下真ん中あたりが白くなっている、一番マッチしていることを示しています。)
Tip1: cv2.matchTemplateには検索方法がいくつかあって、今回はcv2.TM aCCOEFF_NORMEDを指定してみました。
Tip2: テンプレート画像は写真からそのまま取り出したものなのでピッタリ見つかった。実際は角度が違ったり、ノイズがあったりすると、そこまで相関が高いと判断されないかも。ノイズを入れたデータでやってみたい。
Tip3 : カラー画像の場合は、チャネルを抽出してグレースケールへ変換して処理するのがセオリーらしい。
### 参考
Lesson 5 Quiz その1をやっている間に良いサンプルを見つけました。