Python
 Computer >> コンピューター >  >> プログラミング >> Python

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


テンプレートマッチングは、パッチまたはテンプレートを実際の画像からマッチングできる手法です。これは基本的にパターンマッチングメカニズムです。

PythonにはOpenCVモジュールがあります。 openCVを使用すると、一致するものを簡単に見つけることができます。したがって、この問題では、OpenVCテンプレートマッチング手法が使用されます。

OpenCV機能を使用するには、 pipを使用してダウンロードする必要があります 。

sudo pip3 install opencv-python

テンプレートマッチングタスクには、精度係数があります。この係数はしきい値と呼ばれます。一例として、このテンプレートマッチングソリューションを使用して、顔認識スキームを簡単に作成できると言えます。目やその他の顔の部分の画像を提供し、それらの画像をテンプレートとして使用すると、一致を簡単に見つけることができますが、目のバリエーションは異なります。したがって、精度レベルを50%に設定すると、精度レベル100%よりも検出が向上します。通常、精度レベルはさまざまなケースで80%です。

テンプレートを照合する手順

  • 実際の画像を取得して、グレースケール画像に変換します。

  • テンプレートをグレースケール画像として使用

  • テンプレートは実際の画像上をスライドして、精度レベルが一致する場所を見つけます。

  • 結果が精度レベルよりも大きい場合は、その位置を検出済みとしてマークします。

最初のケースでは、入力画像とテンプレートは-

です。

メイン画像

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

テンプレート

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

サンプルコード

import cv2
import numpy as np
#open the main image and convert it to gray scale image
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
#open the template as gray scale image
template = cv2.imread('template1.png', 0)
width, height = template.shape[::-1] #get the width and height
#match the template using cv2.matchTemplate
match = cv2.matchTemplate(gray_image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
position = np.where(match >= threshold) #get the location of template in the image
for point in zip(*position[::-1]): #draw the rectangle around the matched template
   cv2.rectangle(main_image, point, (point[0] + width, point[1] + height), (0, 204, 153), 0)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)

出力

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

上記のコードはマルチスケーリングをサポートしていません。したがって、テンプレートのサイズが同じでない場合、テンプレートは検出されません。したがって、次のパートでは、マルチスケーリング機能を使用してテンプレートを検出する方法を説明します。

このアプローチでは、実際の画像はパターンと一致するたびにさまざまなサイズに変換され、一致するものを見つけるために最大の相関係数が検出されます。

ここでは実際の画像は同じです。テンプレートはここにあります-

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

サンプルコード

import imutils
import cv2
import numpy as np
#Open template and get canny
template = cv2.imread('template3.jpg')
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
template = cv2.Canny(template, 10, 25)
(height, width) = template.shape[:2]
#open the main image and convert it to gray scale image
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
temp_found = None
for scale in np.linspace(0.2, 1.0, 20)[::-1]:
   #resize the image and store the ratio
   resized_img = imutils.resize(gray_image, width = int(gray_image.shape[1] * scale))
   ratio = gray_image.shape[1] / float(resized_img.shape[1])
   if resized_img.shape[0] < height or resized_img.shape[1] < width:
      break
   #Convert to edged image for checking
   e = cv2.Canny(resized_img, 10, 25)
   match = cv2.matchTemplate(e, template, cv2.TM_CCOEFF)
   (_, val_max, _, loc_max) = cv2.minMaxLoc(match)
   if temp_found is None or val_max>temp_found[0]:
      temp_found = (val_max, loc_max, ratio)
#Get information from temp_found to compute x,y coordinate
(_, loc_max, r) = temp_found
(x_start, y_start) = (int(loc_max[0]), int(loc_max[1]))
(x_end, y_end) = (int((loc_max[0] + width)), int((loc_max[1] + height)))
#Draw rectangle around the template
cv2.rectangle(main_image, (x_start, y_start), (x_end, y_end), (153, 22, 0), 5)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)

出力

<中央> PythonでOpenCVを使用したテンプレートマッチング
  1. PythonOpenCvモジュールを使用して画像に幾何学的形状を描画します

    OpenCVの基本的な操作は、画像を描画することです。線、円、長方形などのさまざまな幾何学的形状を追加する機能。 多くの場合、画像分析を使用して、画像の一部を強調表示する必要があります。たとえば、その部分を定義する長方形を追加します。また、例として、何かを示す矢印。 cv2.line()-この関数は、画像に線を引くために使用されます。 cv2.rectangle()-この関数は、画像に長方形を描画するために使用されます。 cv2.circle()-この関数は、画像に円を描くために使用されます。 cv2.putText()-この関数は、画像にテキストを書き込むために使用されます。 c

  2. PythonOpenCvを使用してリバースモードでビデオを再生する

    OpenCvの完全な形式はオープンソースのコンピュータービジョンであり、このライブラリを使用して、画像やビデオに対してさまざまな操作を実行できます。 OpenCVのアプリケーション領域 顔認識システム モーショントラッキング 人工ニューラルネットワーク ディープニューラルネットワーク ビデオストリーミングなど Windowsにインストールする場合は、このコマンドラインを使用できます pip install opencv-python Linuxの場合- sudo apt-get install python-opencv タスクを完了するには、いくつかの手順に従う必要