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()
検索対象画像
テンプレート画像
マッチ結果
なんというか、ほぼぴったり一致しないとヒットしない。
「顔」のような抽象的な検索ではない。