[matplotlib animation] 74. テンプレートマッチングによる物体追跡アニメーション

matplotlib Animation

はじめに

matplotlibのFuncAnimationでscikit-imageのテンプレートマッチングで物体追跡をしたアニメーションを表示する。

コード

解説

モジュールのインポートなど

動画から画像の取り出し

動画からの画像データの抽出は下記記事と同様にして行った。

[Python] 1. imageioでMP4ファイルからPNG画像を出力
画像ファイルを扱うライブラリであるimageioで動画ファイル(.mp4)からPNG画像を出力する方法を説明する。

動画データには、chrome://dinoで遊べることができるゲームをスマートフォン上でキャプチャしたもの用いた。
取り出した画像の枚数と動画のメタデータは下記のようになる。
なお、vid.close()をしておかないとメモリ不足になる可能性がある。

画像の表示

画像の入ったリストは扱いやすくするためにnp.array()に変換する。
最初の画像をrgb2grayでグレースケールに変換して、表示すると下記のようになる。

テンプレートマッチング

テンプレートマッチングによる物体追跡については下記記事で解説した。

[scikit-image] 67. テンプレートマッチングを用いた移動体追跡と位置合わせ(skimage.feature match_template)
skimage.featureのmatch_templateにより、複数の画像に対してテンプレートマッチングを行うことで動く物体を追跡した例について説明する。

テンプレート画像

テンプレート画像には上の画像を用いる。

テンプレートマッチング

x, yは最も適合度の高い座標となる。

結果の表示

左がテンプレート画像で、右上が元画像でマッチングした部分に緑四角を表示した。
右下はテンプレートマッチングの結果をカラーマップで示していて、マッチングしている部分だけ強度が高く、赤色になっていることがわかる(円で囲んだ部分)。

リスト内の画像に対する処理

すべての画像をグレースケールに変換

マッチング結果の最大値とその座標の取得

最初に、からのリストを作成する。
最初の画像から順次テンプレートマッチングを行い、その最大値を取得してリストに追加していく。

このときの最大値の変化は下図のようになる。0.9をしきい値として、最大値の値が0.9より大きい場合だけ、最大値の座標を取得し、リストに流し込んでいく。0.9以下の場合はnp.nanをリストに追加する。

アニメーションの設定

図の表示など

テンプレートマッチング結果の表示のときと同じように、最初の画像と適合する位置に緑四角を表示する。

アニメーション関数の設定

最初に画像をいれるリスト(imgss)を作成しておく。
imgss.pop().remove()などは、リスト内にある画像を消去することを意味する。つまり画像を消して表示するを繰り返してアニメーションを作成する。

移動する物体に追従するために緑四角を動かす。動かすには、rect.set_xy()で新しい座標を入れてやれば良い。

アニメーションの表示

FuncAnimationでアニメーションを表示する。元動画と同じ60 fpsになるようにintervalを調整した。
HTML(ani.to_html5_video())により、jupyter notebook またはjupyter lab上にアニメーションを表示できる。

ani.save(‘ファイル名’, writer=”ffmpeg”,dpi=100)でアニメーションをMP4形式で保存することができる。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

Template Matching — skimage 0.26.0rc0.dev0 documentation
[Python] 1. imageioでMP4ファイルからPNG画像を出力
画像ファイルを扱うライブラリであるimageioで動画ファイル(.mp4)からPNG画像を出力する方法を説明する。
[scikit-image] 67. テンプレートマッチングを用いた移動体追跡と位置合わせ(skimage.feature match_template)
skimage.featureのmatch_templateにより、複数の画像に対してテンプレートマッチングを行うことで動く物体を追跡した例について説明する。

コメント