【Python】OpenCVを使ってパターンマッチングをする

はじめまして、AMDlabの番匠です。

今回は、OpenCVを使って動画の中に特定のパターンを探しその秒数を特定する方法を紹介したいと思います。

まず、OpenCVとは画像(動画)処理のためのオープンソースライブラリです。

公式サポート言語は

  • Python
  • C++
  • C
  • Java

となっています。今回はPythonを使っていきます。

 

動画の中から特定のパターンを見つける

動画からのパターンマッチングは以下の流れで行います。

  1. 動画を一定の間隔で画像にする。
  2. 画像の情報量を減らす。
  3. パターンマッチングを行う。

下準備をする

以下のコードで1と2を行いパターンマッチングの下準備をします。

OpenCVで動画をinterval_sec秒毎のフレーム(フルカラー)からグレーのグラデーションに加工し、さらにそれを閾値を境に白黒に加工し出力しています。

閾値の設定はいろいろありますが、今回は画像の特徴が出やすい閾値を算出してくれる大津の2値化の手法を利用します。

 

画像の情報量が多かったり動画時間が長いと処理時間が伸びてしまいますのでなるべくトリムなどをしましょう・

次に出力した画像ごとにパターンマッチングを行います。

パターンマッチングを行う

ではいよいよ画像のパターンマッチングを行います。

第一引数、第二引数にテンプレートとなる画像、検出対象の物体を探すフレームを設定し、第三引数に類似度の計算方法を設定します。

マッチング結果をパースし類似度最大箇所が90%を越えるかどうかで判断します。

では、例でインベーダーゲームの自機の位置を探してみましょう!

入力画像はこちらです

ここから緑の自機を探してみようと思います。

テンプレート画像

検索結果ヒートマップ

赤黒に近いところほどマッチ度が高くなります。

閾値を95%に設定し、マッチした箇所を囲ってみましょう

 

自機を三機見つけられました!

いかがでしょうか。今回は動画のパターンマッチングを例に取り上げましたが、OpenCVには他にも顔認識、文字認識など画像処理を簡単に扱える機能が搭載されていますので是非使ってみてください!

ARTICLES