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から確認したバージョンです。途中で「ドキュメント」と日本語が入っていますが、これはあまり良くありません。プログラムが正常に動かない場合もあります。
コメント