opencv チュートリアルチャレンジ12 テンプレートマッチング

テンプレートマッチング — OpenCV-Python Tutorials 1 documentation

void matchTemplate(const Mat& image, const Mat& templ, Mat& result, int method)
テンプレートと,それに重なった画像領域とを比較します.

パラメタ:   
image – テンプレートの探索対象となる画像.8ビットまたは32ビットの浮動小数点型.
templ – 探索されるテンプレート.探索対象となる画像以下のサイズで,同じデータ型でなければいけません.
result – 比較結果のマップ.シングルチャンネル,32ビット,浮動小数点型. image が  W x H で, templ が  w x h とすると result は  (W-w+1) x (H-h+1) となります.
method – 比較手法の指定(以下の説明を参照してください).

やってみる

#!/usr/bin/env python
# -*- coding: utf-8 -*
import sys
import cv2
import numpy as np
from matplotlib import pyplot as plt

imgOrg = cv2.imread('mario.png')
img = cv2.cvtColor(imgOrg, cv2.COLOR_BGR2GRAY)

template = cv2.imread('mario.coin.png',0)
w, h = template.shape[::-1]

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

cv2.imshow('matchTemplate',imgOrg)
cv2.imwrite('matchTemplate.png',imgOrg)

cv2.waitKey(0)
cv2.destroyAllWindows()

検索対象画像
f:id:pongsuke:20170523163827p:plain

テンプレート画像
f:id:pongsuke:20170523163838p:plain

マッチ結果
f:id:pongsuke:20170523163831p:plain

なんというか、ほぼぴったり一致しないとヒットしない。

「顔」のような抽象的な検索ではない。