超強力なオープンソース3DCGソフト「Blender」のモーショントラッキングデータを書き出したい話―マーカー座標をビルトインPythonでCSV書き出し―

最近、動画から振動パターンを分析したいという案件がありました。具体的には、動画に映っているマーカーの動きをトラッキングして、数値として取り出したい。

Blenderのモーショントラッキング機能を使ったらうまく行ったので、その方法を記録します。

Blenderでモーショントラッキング

これは動画で見たほうがわかりやすいので、この辺りのチュートリアルを流し見てみてください。

youtu.be

このチュートリアルでは、ノードでコンポジットするところまで触れられていますが、今回の用途で必要なのは〜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コード

こちらの記事で紹介されているコードを参考に、少し使いやすく調整しました。

blog.svenbrauch.de

シンプルなコードなので、詳しい解説は省きます。

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すごい。