OpenCV実験python3 テンプレート比較で特定の形の図が存在するか判定 cv2.matchTemplate実験 その1

こちらはとある画像ファイルから特定の形の図形をそれなりに存在するか判定して画像での座標を教えてくれる機能を作りたくて調査した結果です。

こちらを参考にした記事になります。

https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html

テンプレートマッチング、というのでしょうか、検索してみつけて、これだ!簡単ジャン、と思ったのですが、いろいろ試して検証してみた結果こちらはまだまだ私には敷居が高いことがわかりました。

難点は同じサイズ(画素数が)であれば結構な精度で場所を教えてくれるのですが、ちょっとサイズが違ったりするともうマッチングできない、ということがわかります。

サイズが違ってもマッチングさせるには学習させないとダメみたいで私にはまだ敷居が高かったですね。。とりあえず以下では学習なしの簡単テンプレートマッチングの実験結果です。

まずはマッチングが正しく動作するか簡単に検証してみます。以下の画像を準備しました。

こちらが入力ファイルです。(sample.jpg)

解析したい図形
sample.jpg

こちらが検出したいオブジェクトです。上の図の右下の四角をコピペした作成した画像です。

テンプレート図形
template.jpg

チュートリアルはさくっとグレースケールでマッチングする例が書いていますが、私が躓いたのはcv2.matchTemplateする場合の画像ファイルデータはちゃんとカラーかグレースケールのどちらかで統一しないとダメ、ということでしたね(そんなところで間違うプログラマもいないですかね。。)。

カラーでもマッチングできます。ためしにこちらのサンプルではカラーでのマッチングを実施してみます(実際の実装ではグレースケールと思いますが。。)。青い四角をサンプル画像に入れているのはのちほど色もふまえたマッチングを検証するためです。

またマッチングの方法も6つくらいあるようですが、簡便のため、cv2.TM_CCOEFF_NORMEDひとつで検証です。

まずは一番マッチしたオブジェクトをひとつだけ選んで四角で囲むサンプルコードになります。

#TemplateMatchColor.py

import cv2
import numpy as np

infile ='sample.jpg'
templatefile='template.jpg'
outfile='output.jpg'

#カラー読み込み
img = cv2.imread(infile)
img2 = img.copy()

#カラー読み込み
img_template = cv2.imread(templatefile)
#カラー読み込みなのでひとつ要素が多い。
s,w,h=img_template.shape[::-1]

res = cv2.matchTemplate(img,img_template,cv2.TM_CCOEFF_NORMED)
#max_locが画像の左上からの位置。
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

#黒色(0,0,0)の四角で囲む。
cv2.rectangle(img2, max_loc, (max_loc[0] + w, max_loc[1] + h), (0,0,0),4)
cv2.imwrite(outfile,img2)

こちらが出力された画像です。無事右下の赤四角が黒四角でかこまれています。

処理結果

続きます。