Python で OpenCV を使用したテンプレートマッチング
Python の opencv
ライブラリは、多くの技術とアルゴリズムを実装しています。このライブラリを使用して、さまざまなコンピュータビジョンおよび AI タスクを実行できます。
このライブラリのそのような機能の 1つは、テンプレートマッチングです。
この手法について詳しく説明します。テンプレートマッチングとは、画像のごく一部が別の画像の一部であるかどうかを確認することです。
この小さな部分(テンプレートとも呼ばれます)は、画像上で水平方向および垂直方向に移動され、テンプレートの最も可能性の高い位置を見つけます。opencv
を使用したテンプレートマッチングには、多くの実際のアプリケーション、特にオブジェクト検出があります。
このチュートリアルでは、Python で opencv
を使用してテンプレートマッチングを実行する方法を示します。
Python で matchTemplate()
関数を使用して OpenCV を使用してテンプレートマッチングを実行する
matchTemplate()
関数を使用して、画像内の特定のテンプレートの位置を見つけることができます。両方の画像をこの関数に渡すことができます。この関数は、テンプレートを両方向にスライドさせて、最適な場所を見つけます。
各場所のピクセル密度が計算され、密度が最も高い場所(明るいピクセル)が最も一致する可能性が高くなります。matchTemplate()
はいくつかのメソッドを使用し、method
パラメーターを使用して指定されます。
合計で 6つあります:TM_CCOEFF
、TM_CCOEFF_NORMED
、TM_CCORR
、TM_CCORR_NORMED
、TM_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()
出力:
ここで、コードについて詳しく説明します。まず、必要な画像を読みます。
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()
出力:
上記の例は、最小値インデックスを使用してテンプレート座標を計算することを示しています。残りのコードは同じままです。
まとめ
このチュートリアルでは、Python で opencv
を使用したテンプレートマッチング手法を示しました。テンプレートマッチングの基本と、この手法を実装する opencv
ライブラリの関数について説明しました。
関数に関連するいくつかの方法についても説明しました。この関数と他のいくつかの関数を使用したこの手法の実際の実例を見ました。
すべての行の目的を強調することによって、それは詳細に議論されました。
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