はじめに
skimage.featureのmatch_templateにより、複数の画像に対してテンプレートマッチングを行うことで動く物体を追跡した例について説明する。
コード
コードをダウンロード(.pyファイル)
コードをダウンロード(.ipynbファイル)
解説
モジュールのインポートなど
画像の読み込み
webブラウザChromeのchrome://dino/で遊べるゲームの画像を用いる。スクリーンショットを切り取ったものを使う。切り取りは下記記事を基にして行った。
mpl_toolkits.axes_grid1 のImageGridを用いて画像を表示すると下記のようになる。
今回はこの画像のサボテンの位置の変化を追跡する。
テンプレートマッチング
テンプレートマッチングについては下記記事で解説した。
imageのなかのsaboに該当する部分をテンプレートマッチングで検出する。
match_templateでpad_input=Trueとすることで適当な補間を用いてテンプレートマッチングすることになるので、出力画像のサイズが入力画像と等しくなる。
np.unravel_index(np.argmax(result), result.shape)により、最大値のインデックス=最も適合する部分のインデックスを得ることができる。
ijはy,x の順となっているので、x, y = ij[::-1]として正しいx,yの値を得る。
結果はGridSpecを用いて示した。左の画像がテンプレート画像で、右上の画像が元画像で最も適合する部分にテンプレートのサイズを使って四角を描写している。右下がmatch_templateの出力画像であり、サボテンの部分のみ赤くなっていることがわかる。
全画像のサボテンの位置を求める
複数画像に対してテンプレートマッチングを行い、得られた座標に緑丸線をプロットした。画像は透明度を0.1として複数表示した。
テンプレートマッチングで検出した画像の位置合わせ
最初の画像を基準にして、各画像でサボテンの位置の差を求めた。
その差の分だけ、AffineTransformとwarpを用いて、画像をシフトした。全画像の透明度を0.2として複数表示すると上記のようになる。
サボテンの位置にブレがなく、完全一致していることがわかる。
コメント