最近、動画から振動パターンを分析したいという案件がありました。具体的には、動画に映っているマーカーの動きをトラッキングして、数値として取り出したい。
Blenderのモーショントラッキング機能を使ったらうまく行ったので、その方法を記録します。
Blenderでモーショントラッキング
これは動画で見たほうがわかりやすいので、この辺りのチュートリアルを流し見てみてください。
このチュートリアルでは、ノードでコンポジットするところまで触れられていますが、今回の用途で必要なのは〜1:40辺りまで。これで全体の9割は終わりです。ちなみに、トラッカーの名前がCSVファイル名に入るので、わかりやすい名前に変更しておくと良いです。
トラッキングデータをビルトインPythonで書き出す
あとはこのトラックデータを書き出すだけですが、標準ではそのための機能がありません。
しかし、ここからがBlenderのイケてるとこで、BlenderにはPython API&ビルトインPython実行環境が用意されていて、ほとんどの機能・データをPythonから触ることができます。
トラッキングデータはbpy.data.movieclips[].tracking.tracks[].markers.find_frame(フレーム番号).co.xy
に[x,y]
の形で入っているので、これをフレーム数ぶん読み出して、CSVなりなんなり書き出せば良いわけです。
Pythonコード
こちらの記事で紹介されているコードを参考に、少し使いやすく調整しました。
シンプルなコードなので、詳しい解説は省きます。
import bpy import os data = bpy.data for clip in data.movieclips: for track in clip.tracking.tracks: # 出力先は.blendファイルと同じ場所、クリップ名とマーカー名を付ける file_name = os.path.dirname(bpy.data.filepath) + f'/track_{clip.name.split(".")[0]}_{track.name}.csv' with open(file_name, 'w') as f: # タイトル列を作る f.write(f'No.,x,y\n') # 開始フレームから読む frame_no = bpy.context.scene.frame_start while True: marker_at_frame = track.markers.find_frame(frame_no) if not marker_at_frame: break coords = marker_at_frame.co.xy coords_zero = track.markers.find_frame(0).co.xy # 座標がクリップの縦/横をそれぞれ1とした比で与えられるので、実座標に直す x = (coords[0] - coords_zero[0]) * clip.size[0] y = (coords[1] - coords_zero[1]) * clip.size[0] #カンマ区切りで書き込み f.write(f'{frame_no},{x},{y}\n') frame_no += 1 print('done!')
使い方
「全般」→「Scripting」ワークスペースを追加
「新規」でテキストファイルを追加
.blendファイルのパスを使うので、先に保存しておいてから、Pythonコードを張り付けて、右上の実行ボタンを押せば
.blendファイルと同じフォルダにCSVファイルが書き出されます。
これでトラッカーのx座標,y座標が手に入ったので、あとは煮るなり焼くなりお好きに。
まとめ
Blenderすごい。