[scikit-image] 67. テンプレートマッチングを用いた移動体追跡と位置合わせ(skimage.feature match_template)

python

はじめに

skimage.featureのmatch_templateにより、複数の画像に対してテンプレートマッチングを行うことで動く物体を追跡した例について説明する。

コード

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

解説

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

画像の読み込み

webブラウザChromeのchrome://dino/で遊べるゲームの画像を用いる。スクリーンショットを切り取ったものを使う。切り取りは下記記事を基にして行った。

[scikit-image] 64. 画像の切り取り(skimage.util crop)
skimage.utilのcropを用いて、画像を切り取る(トリミングする)方法について説明する。

mpl_toolkits.axes_grid1 のImageGridを用いて画像を表示すると下記のようになる。

今回はこの画像のサボテンの位置の変化を追跡する。

テンプレートマッチング

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

[scikit-image] 44. テンプレートマッチングによる画像識別(skimage.feature match_template)
skimage feature match_templateによりテンプレート画像と一致する部分を画像中から検出した例を示す。

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として複数表示すると上記のようになる。
サボテンの位置にブレがなく、完全一致していることがわかる。

参考

Template Matching — skimage v0.17.2 docs
Module: feature — skimage v0.17.1 docs
Module: transform — skimage v0.17.2 docs
Module: transform — skimage v0.17.2 docs

コメント