【Python】OpenCVを用いた画像処理(テンプレートマッチング)

Python

 OpenCVを用いた画像処理について解説します。今回はテンプレートマッチングについてです。

OpenCVのインストール

 最初に、OpenCVを使えるようにするためにopencv-pythonをインストールする必要があります。コマンドプロンプトを起動し、以下のコードを実行してください。(すでにインストール済みの方はもちろん不要です。)

pip install opencv-python
pip install opencv-contrib-python
pip install numpy

 これで画像処理を行う準備ができました。
 OpenCV(Open Source Computer Vision Library)は画像処理用の関数が多数実装されたオープンソースのライブラリです。マルチプラットフォームなので幅広く使われており、これを利用して画像処理を行っていきます。

画像処理

 今回はWindowsでVisual Studio Codeを使用してコードを書いていきます。コードについての大まかな説明はコメントアウトを利用して行います。

テンプレートマッチング

左:ベース画像 中:テンプレート画像 右:結果

 テンプレートマッチングとは、ある画像の中から、任意の画像(テンプレート画像)と一致する場所を探す処理です。

5行目、6行目:cv2.imread(‘対象となる画像’)
 これで対象となる画像を読み込みます。

8行目:画像.copy()
 マッチした箇所を四角で囲むときに使う画像として、ベース画像をコピーしています。

10行目:cv2.matchTemplate(ベース画像, テンプレート画像, 類似度の計算方法)
 ここではベース画像とテンプレート画像を比較して、類似度を計算しています。類似度画像の白が強い箇所が、ベース画像とテンプレート画像の類似度が高い箇所となります。

11行目:min_val,max_val,min_pt,max_pt = cv2.minMaxLoc(画像)
 こちらは、10行目で計算した類似度画像から、最小類似度の値・最大類似度の値・最小類似度の座標(x,y)・最大類似度の座標(x,y)を取得しています。

13行目:h, w, ch = 画像.shape
 ここでは画像の、高さ・幅・チャンネル数を取得しています。画像は高さ×幅の行列として表現されています。

14行目:cv2.rectangle(画像, 座標, (長方形の幅, 長方形の高さ),(B,G,R),線の太さ)
 マッチした箇所を長方形で囲むためのプログラムです。8行目でコピーした画像をここで使用しています。max_ptは長方形の左上の座標、(max_pt[0]+w, max_pt[1]+h)はテンプレート画像と同じ大きさの長方形を描くことを意味しています(このプログラムにおいてmax_ptは最大類似度の座標(x,y)なので、max_pt[0]は最大類似度のx座標となる)。また、(B,G,R)は線の色を指定しています。

16行目~19行目:cv2.imshow(“ウィンドウに表示される文字”, 表示させる画像)
 画像をウィンドウとして表示させます。

ウィンドウに表示される文字とは、左上の文字のことです(この場合は「base」)。

21行目:cv2.waitKey()
 これは次の処理を行うまでの待機時間についての命令です。()内に数値を入れて待機時間を設定します。1000で1秒間待機です。()内が0なら、適当なキーが押されるまで待機ということになります。

22行目:cv2.destroyAllWindows()
 これで表示させたウィンドウを全て閉じます。つまり、21,22行目は「適当なキーを入力した時、16~19行目の命令で表示させたウィンドウを閉じる」ということです。

↓コピー用プログラム

import cv2
import math
import numpy as np

img_base = cv2.imread('ベース画像') #ベース画像の読み込み(この画像から探す)
img_tmp = cv2.imread('テンプレート画像') #テンプレート画像の読み込み

img_cp = img_base.copy() #ベース画像のコピーをとる

img_match = cv2.matchTemplate(img_base, img_tmp, cv2.TM_CCOEFF_NORMED) #類似度
min_val,max_val,min_pt,max_pt = cv2.minMaxLoc(img_match) #類似度の最大・最小の判別

h, w, ch = img_tmp.shape #画像の高さ、幅、チャンネル数の取得
cv2.rectangle(img_cp, max_pt, (max_pt[0]+w, max_pt[1]+h),(147,69,142),5) #マッチ箇所を四角で囲む

cv2.imshow("base",img_base) #ベース画像を表示させる
cv2.imshow("ruiji",img_match) #類似度画像を表示させる
cv2.imshow("template",img_tmp) #テンプレート画像を表示させる
cv2.imshow("match",img_cp) #結果画像を表示させる

cv2.waitKey(0) #キー入力待ち
cv2.destroyAllWindows() #表示させた全てのウィンドウを閉じる

 使用する画像はプログラムと同じフォルダーに入れて実行してください。
「cv2.imwrite(‘保存名’, 保存する画像)」で画像を保存することもできます。

実行方法

 作成したプログラムの実行方法についてです。

 まずはコマンドプロンプトを開きます。画面左下の検索バーに「cmd」と入力すると出てくると思います。
 次にプログラムファイルの位置を知る必要があります。

 エクスプローラーを開いてプログラムファイルがあるところまで行き、上部を確認してください。今回はUSBにフォルダーを作成し、(F:)となっています。USB内の「gazousyori」というフォルダー内に「tmp-match.py」という名前のプログラムを作成しました。ここにコマンドプロンプトの「cd」でディレクトリを変更します。言葉で説明するのが難しいので以下の画像を参照してください。

 後はエンターを押すだけで実行できます。別例も以下に挙げておきます。

 プログラムファイルの保存場所が異なる&Visual Studio Codeから確認したバージョンです。途中で「ドキュメント」と日本語が入っていますが、これはあまり良くありません。プログラムが正常に動かない場合もあります。

コメント

タイトルとURLをコピーしました