はじめに
scikit-imageのテンプレートマッチングによる物体追跡により、対象物がジャンプした回数を計測した結果をmatplotlib, FuncAnimationのアニメーションで表示する。
コード
解説
モジュールのインポートなど
動画から画像の取り出し
動画からの画像データの抽出は下記記事と同様にして行った。
動画データには、chrome://dinoで遊べることができるゲームをスマートフォン上でキャプチャしたもの用いた。
取り出した画像の枚数と動画のメタデータは下記のようになる。
なお、vid.close()をしておかないとメモリ不足になる可能性がある。closeしてもメモリ不足になる場合、del vidでメモリを確保する。
画像の表示
画像の入ったリストは扱いやすくするためにnp.array()に変換する。
画像をrgb2grayでグレースケールに変換して、最初の画像を所定の範囲で切り取った画像を表示すると下記のようになる。
リスト内の画像をすべて所定の範囲で切り取る。
テンプレートマッチング
テンプレートマッチングによる物体追跡については下記記事で解説した。
テンプレート画像
テンプレート画像には上の画像を用いる。
テンプレートマッチング
x, yは最も適合度の高い座標となる。
結果の表示
左がテンプレート画像で、右上が元画像でマッチングした部分に緑四角を表示した。
右下はテンプレートマッチングの結果をカラーマップで示していて、マッチングしている部分だけ強度が高く、赤色になっていることがわかる(円で囲んだ部分)。
リスト内の画像に対する処理
マッチング結果で最大値となる座標の取得
最初に、何も入っていないリストを作成する。
最初の画像から順次テンプレートマッチングを行い、その最大値の座標を取得し、リストに加えていく。
得られたy方向の座標の変化のリストをnp.arrayに変換しておく。
ピーク検出
argrelminを使ってピークを検出する。検出したピークは上図の赤丸で示した部分となる。
ジャンプした回数の計測
ピークのインデックスを過ぎたときにそのデータ以降に1を加えることで、それまでにジャンプした回数の配列を作成する。
アニメーションの設定
図の表示など
最初の画像とジャンプした回数をテキストで表示する。
アニメーション関数の設定
最初に画像をいれるリスト(imgss)を作成しておく。
imgss.pop().remove()などは、リスト内にある画像を消去することを意味する。つまり画像を消して表示するを繰り返してアニメーションを作成する。
テキストに対して、set_textをすることでテキストを変化させるアニメーションとする。
アニメーションの表示
FuncAnimationでアニメーションを表示する。元動画と同じ60 fpsになるようにintervalを調整した。HTML(ani.to_html5_video())
により、jupyter notebook またはjupyter lab上にアニメーションを表示できる。
ani.save(‘ファイル名’, writer=”ffmpeg”,dpi=100)でアニメーションをMP4形式で保存することができる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント