見出し画像

Matlabで動いているものの軌跡を出す

定点カメラの動画などから、動いているものを検出し、その軌跡をプロットするコードです。ここでは例として、火球の軌跡を出してみました。
コピペできるコードは末尾にあります。

使いみちとしては、太陽の黒点観測、ドローンの軌跡解析、行動薬理研究での齧歯目の行動試験解析、などでしょうか。行動解析では今ではDeepLabCutみたいな良いツールもあるんですが、Matlabユーザーでは手っ取り早く実装したい場合にこの記事を参考にしてくれたら良いかな、と思って紹介しています。Matlabって公式のユーザーガイドは充実してるけど、エンドユーザー側のものはあんまりなくて、初心者はちょっととっつきにくい部分があるんですよね。

さて、今回は素材として、NHKクリエイティブ・ライブラリーの火球の映像を使います。

スクリーンショット 2022-02-06 205923

この動画から、火球の座標を各フレームについて求め、その軌跡をプロットします。
完成形はこうなります。

スクリーンショット 2022-02-06 210428

正直、これはとても簡単に実装できるので、他にも似たような目的の例文コードを紹介してくれているサイトは多くあると思います。ここでは、とにかくシンプルに、最低限のことを初心者でも書けるように紹介していきます。

実装

動画ファイルを読み込みます。ここでは先述のNHKの火球の映像から53~58秒付近を切り取ったものを使いました。

次に、ここからは自分でパラメータを設定する部分です。
「検出の閾値」は、検出対象のオブジェクトの輝度に合わせて調整しましょう。

次に解析の準備その1です。読み込んだ動画のフレーム数を算出、あと目的の座標を格納するposi変数を作っておきます。

次に解析の準備その2です。解析対象のROIを指定します。
この処理は必ずしもなくても良いんですが、今回の動画では画面下部に街明かりがあり、また左上にNHKのロゴがあるため、「輝度の高いエリア=火球の位置」として定義すると、これらが邪魔になってしまうわけです。

スクリーンショット 2022-02-06 205923

なので、これらを含まないエリアをROIとしてユーザーに指定してもらうようにします。ginput関数を使います。

で、後半では入力したROIの座標やサイズを取り出しています。

さて、いよいよ火球の座標を求めていきます。forループで動画から1フレームずつ画像を読み込んでいきます。

まずdispにより、今何フレーム目を処理しているかをコマンドウィンドウに表示しています
readで動画ファイルを読み込み、imgにROI内の各ピクセルの輝度を入れます。
でimg_thr変数に閾値より輝度が明るい場所の座標を求めます。閾値より明るい部分が複数ある場合は、最も面積の大きいオブジェクトが選ばれるようになっています。で、その重心座標をposiに入れています。

最後に、検出した座標がscatter関数によりリアルタイムに表示されるようになっています。赤いのがオブジェクト座標です。なんかGIFに変換した際にチカチカしちゃってますが、うまいこと火球と重なっているのがわかります。

画像4

最後に軌跡をプロットします。

スクリーンショット 2022-02-06 205842

うまく検出することができました。火球は流れ星と同じく一直線に落ちますね。

はい、これでとりあえず終わりです。今回は流れ星みたいなS/N比が非常に良い素材を使ったので簡単に検出できましたが、一般的にはもうちょっと工夫が必要な素材がほとんどだと思います。そういうときの工夫のコツについては、また今度紹介していきます。

コピペできるコードの完全版は「続きをみるには」で読めます。ちょっとコメントも付けています。

ここから先は

1,601字

¥ 100

この記事が気に入ったらサポートをしてみませんか?