運動解析プログラムVMAP

高速度ビデオグラフィで得られた動画像でターゲットROIのトレースを行う

まずは動かして見ましょう。

こんな外観です。左上の“Open”をクリックすると、動画ファイル選択ダイアログになります。このプログラムで解析できるのは、高速度ビデオで記録された動画像で、島津製作所の高速度ビデオカメラのファイル拡張子(*.dat)と一般的なAVIファイルです。

上記の.Datファイルを選択してみます。

これはPCのケース内で使われている冷却ないし換気用のファンの回転を記録したもので、左側のペインにスタートフレームが表示されています。50フレーム進めてみましょう。EditBoxに50と入れて、右矢印をクリックします。で左側のフレームは巻き戻しておきます。

ここで“Add Roi”を押します。Roiを一個定義しました。RoiはRegion of Interestであり、対象物体ないしフレーム内の特定領域(着目領域ともいふ)を定義しています。

Roi #0が一個だけ定義されました。ここで、左側のフレーム0から右のフレーム50まで、このRoiを追跡します。右端に近いところにあるSequentialをクリック、

トレースは終わっていますが、結果をAVIファイルで書き出したければ、“File Writeout”をクリック。

表示パラメータを選択してグラフを描くこともできます。時刻tに対してのX,Yの変化をExcelかIgorに描かせてみましょう。

ここでIgorに切り替えてから、Graph

Igorは6.37です。最新のIgorはDDEをサポートしていないようなのでグラフ描画には使えません。そういう場合には、もっと一般的なExcelを使えばよろしい。

Excelでグラフを描かせるのは、Oleなる仕組みで駆動しています。C++ Builder CEからExcelを操作することは色々とやっているので、そのうち復刻解説するかもしれません。

というようなプログラムをC++ Builder CEで昔は書いていました。トレースの原理は詳しく述べるとまた大部になるので省略しますがおおよそは、

このような計算式で得られる正規化画像相関係数を評価し、最大値を取る画素位置がトレース位置という考え方です。

トレース位置はフレーム(駒)毎に求めますが、前のフレームでの位置を起点として、らせん状に探していくことで、効率的に最大値位置を発見します。効率を重視するのであれば、予想進行方向にステップしてからトレース始めると良いかもしれませんね。対象の運動はある程度の質量を持った物体であり、ブラウン運動はしていないという前提が成り立つはずですから。

これらの図を掲載した論文をpdfでアップすればいいのですが、それを読めというのも酷なので大雑把に解説しました。何かに使えそうだから、バイナリをアップしろという御要望等は、遠慮無くコメントでどうぞ。リクエストがなければ、アップしません。C++ Builderで書いた版は、ここまでで、もっと相関係数の計算を効率化するためにGPUを用いて並列計算する形に進化しています。GPUをドライブするのでCudaを使いましたが、そちらもそのうち紹介するかもしれません。重要かつ興味深いことなので再掲しますが、

下段の評価式で、fがROIで、gが別のフレームの同サイズのROIとすると、平均値の補正はありますが、fやらgはベクトルと考えられる。画素のサイズが横n画素、縦m画素とするとnxm画素が表すのは、nxm次元のベクトルです。(3次元以上のベクトルは想像しにくいのではありますが。)ということは二つのベクトルの内積をそれぞれのノルム(大きさ)の積で割ったものですから、二つのベクトルのなす角のcosと見なせます。ということは二つのベクトルのなす角を表していることになり、相関(一致度)の一つの評価としては妥当といことがわかります。つまり二つのベクトリが完全に同じ方向であれば、角度はゼロ、つまりそのcosは1になり相関係数は1ということになります。

OleとかDDEとか動画の処理のためのVideo for Windows等が今のWindows 11でも使えるというのが驚きです。

コメント