とりあえず、VMD-Liftingを読み解いてみます。
実行方法
まず、ドキュメントを見ると「vmdlifting.py」を実行して画像データ/動画データからモーションデータを作成するようです。
ということは、最初に見るべきは「vmdlifting.py」となります。
usage: vmdlifting.py [-h] [--center] IMAGE_FILE VMD_FILE
「vmdlifting.py」を読み解く
まずはmainの処理から見ていきます。コマンド引数を処理してvmdlifting関数を呼び出しています。
引数としては、解析対象の画像/動画フィルと出力するVMDファイル名を指定していますね。
if name == 'main': parser = argparse.ArgumentParser(description='estimate 3D pose and generate VMD motion') parser.add_argument('--center', action='store_true', help='move center bone (experimental)') parser.add_argument('IMAGE_FILE') parser.add_argument('VMD_FILE') arg = parser.parse_args() vmdlifting(arg.IMAGE_FILE, arg.VMD_FILE, arg.center)
vmdlifting関数の処理
まず、動画/画像ファイルを読み込んでいます。
readメソッドでは1フレーム単位で読み込んでいくようです。
cap = cv2.VideoCapture(image_file_path) while (cap.isOpened()): ret, image = cap.read()
次に、読み込んだデータをRGBに変換しています。
BGRは「Blue」「Green」「Red」の色の3要素ですがこの並びをかえていると思われます。
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
その後、「PoseEstimator」の初期化処理を実施しフレーム単位で画像解析をしています。
詳細はpose_estimatorの使い方を参照する必要がありますね。
画像(動画)データから3次元での関節位置情報を解析している感じですね。
その後、「refine_position」を呼び出していますが、ここはフィルタ処理を行っているのか???
処理内容は後で見てみるとしましょう。
次に「pos2vmd.py」の「positions_to_frames」を呼び出しています。
ここではボーンのひねりとかを計算して自然な人間の動きにしているようです。
最後にモーションデータのフォーマットで出力して処理完了となってます。
コメント