Python で OpenCV を使用したテンプレートマッチング

Manav Narula 2023年1月30日
  1. Python で matchTemplate() 関数を使用して OpenCV を使用してテンプレートマッチングを実行する
  2. まとめ
Python で OpenCV を使用したテンプレートマッチング

Python の opencv ライブラリは、多くの技術とアルゴリズムを実装しています。このライブラリを使用して、さまざまなコンピュータビジョンおよび AI タスクを実行できます。

このライブラリのそのような機能の 1つは、テンプレートマッチングです。

この手法について詳しく説明します。テンプレートマッチングとは、画像のごく一部が別の画像の一部であるかどうかを確認することです。

この小さな部分(テンプレートとも呼ばれます)は、画像上で水平方向および垂直方向に移動され、テンプレートの最も可能性の高い位置を見つけます。opencv を使用したテンプレートマッチングには、多くの実際のアプリケーション、特にオブジェクト検出があります。

このチュートリアルでは、Python で opencv を使用してテンプレートマッチングを実行する方法を示します。

Python で matchTemplate() 関数を使用して OpenCV を使用してテンプレートマッチングを実行する

matchTemplate() 関数を使用して、画像内の特定のテンプレートの位置を見つけることができます。両方の画像をこの関数に渡すことができます。この関数は、テンプレートを両方向にスライドさせて、最適な場所を見つけます。

各場所のピクセル密度が計算され、密度が最も高い場所(明るいピクセル)が最も一致する可能性が高くなります。matchTemplate() はいくつかのメソッドを使用し、method パラメーターを使用して指定されます。

合計で 6つあります:TM_CCOEFFTM_CCOEFF_NORMEDTM_CCORRTM_CCORR_NORMEDTM_SQDIFF、および TM_SQDIFF_NORMED

TM_CCORR は結果が不正確であるため、適切な選択とは見なされないことに注意してください。もう 1つ覚えておくべきことは、TM_SQDIFF および TM_SQDIFF_NORMED メソッドでは、最小値を選択することです。

これは、以下の例で明らかになります。

この関数について詳しく説明したので、実際の例を見てみましょう。テンプレートと完全な画像が下に表示され、その後にコードと結果が表示されます。

画像:

画像の処理

テンプレート:

処理テンプレート

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = max_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

PythonTM_CCOEFF で opencv を使用したテンプレートマッチング

ここで、コードについて詳しく説明します。まず、必要な画像を読みます。

cvtColor() 関数を使用してこの画像をグレースケールに変換し、画像を必要な色空間に変換します。白黒画像が最良の結果をもたらします。

テンプレートと画像を TM_CCOEFF メソッドとともに matchTemplate() 関数に渡します。

これにより、numpy 配列が返されます。座標を見つけるには、この配列からの値のセットが必要です。

minMaxLoc() 関数は、配列の最小値と最大値、およびそれらのインデックスを検索します。最大値の位置を使用して、最適な座標を計算します。

rectangle() 関数を使用して、一致した部分に長方形を描画します。次に、画像が結果とともに表示されます。

waitKey() および destroyAllWindows() 関数は、出力ウィンドウが自動的に閉じないようにし、ユーザー入力を待ちます。

説明したように、matchTemplate() 関数内で他の説明したメソッドを同様に使用できます。唯一の違いは、TM_SQDIFF メソッドと TM_SQDIFF_NORMED メソッドに関連しています。

コードを少し調整することで、それらを使用できます。次の例を参照してください。

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_SQDIFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = min_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

PythonTM_SQDIFF で opencv を使用したテンプレートマッチング

上記の例は、最小値インデックスを使用してテンプレート座標を計算することを示しています。残りのコードは同じままです。

まとめ

このチュートリアルでは、Python で opencv を使用したテンプレートマッチング手法を示しました。テンプレートマッチングの基本と、この手法を実装する opencv ライブラリの関数について説明しました。

関数に関連するいくつかの方法についても説明しました。この関数と他のいくつかの関数を使用したこの手法の実際の実例を見ました。

すべての行の目的を強調することによって、それは詳細に議論されました。

著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn