FreeMoCapで奥行きを扱えるか試してみた + blenderでデータを扱う方法
経緯
前回の記事で一台のカメラでは奥行きをうまく扱えないと予測した。なので、二台のカメラで奥行情報を得られるか試してみた。
FreeMoCapのキャリブレーションを設定する方法
FreeMoCapの二台以上のカメラで撮影する手順(URL_1)に従って、キャリブレーションの設定 ⇒ 撮影の順に説明します。ついでにblenderでデータを扱いやすくします。
URL_1:https://freemocap.github.io/documentation/multi-camera-calibration.html
その前に、キャリブレーションとは?
カメラの映像に基準がないため正確な位置が計測できない。カメラ毎に向き、レンズも異なるため不正確なデータを取得してしまうらしく、使えないので基準を作っておこうというものらしい。
使用したもの
python、poetry、blenderを使用しています。
pyenv + python 3.12.0
poetry 1.7.1
blender 4.4.3
他にはURL_2のカメラとiphoneを使用してます。Windows PCには「Camo Studio」を、iphoneには「Camo」をインストールしました。
公式のドキュメントより「Charuco Board」が必要なのでURL_3からダウンロード後、プリントアウトしてください。プリントアウトしたものをダンボールに張り付けて使用しました(画像1)。
URL_2:カメラのURL
URL_3:Charuco BoardのURL
| 画像1:貼り付け後のCharuco Board |
|---|
![]() |
試してみる
プリントアウトしたCharuco Boardを使ってキャリブレーション用の撮影データを作成します。画像2より「Record Calibration Videos」にチェックを入れておきます。さらに、ボードのチェックの大きさをはかって「Charuco square size」を 43.0mm にしました(実際は40.0mmでした)。
チェックの大きさは、画像1の一番左上の黒ブロックです。横の大きさを計ってください。
| 画像2:FreeMoCapのCameras |
|---|
![]() |
次に、【Cameras】の一番大きいボタン「detect Available Cameras」か、「Control Panel」の「detect Available Cameras」を押します。
「Display Charuco Overlay」にチェックを入れているので、画像3・4のように「id?」が表示されます。このid達が基準になるのでしょうか。
| 画像3:webカメラのボード | 画像4:iphoneカメラのボード |
|---|---|
![]() |
![]() |
ボードの撮影する時、二台カメラの両方に映るようにボードを掲げて、上下に動かしました(数秒でいいようです)。画像3・4のボードはカメラに近づけた時のものです。実際にはもっと離れて撮影すると思います。その時、ボードが粗く描画されます。それでもちゃんとキャプチャーできました。
ログに「Anipose camera calibration data saved to calibrations folder, recording folder, and 'Last Successful Calibration' file.」が出れば、キャリブレーションに関わるディレクトリが作成されたことになると思います。
後は、奥行情報を与えた映像でデータがどうなるのか試してみます。結果は映像1・2です。
| 映像1:FreeMoCapの位置データ | 映像2:blenderのモーションデータ |
|---|---|
![]() |
![]() |
映像1はFreeMoCapの【Data Viewer】で確認できます。位置データの顔は動いていないですが、blender上では動いている。補完によるものでしょうか。進みながら羽ばたいているので、奥行情報は手に入れられたようです。カメラの視界の外や遮蔽物に人物が遮られると、データが取れずにカクつくようです。
blenderでデータを扱う
映像1は作成されたデータです。鳥の羽ばたきをイメージしています。扱いたいデータは両腕の「left_wrist」と「right_wrist」です。
データを適用したいモデルは画像5:①のモデルで、カラスをイメージしています。このモデルの両翼にアニメーションを適用します。
| 画像5:烏のモデル |
|---|
![]() |
モーションデータの追加方法
blenderのFileメニュー ⇒ Appendで「recording_XX_XX_XX_gmt+9.blend」をダブルクリックします。次に、ディレクトリ名:Object内の「left_wrist」と「right_wrist」の二つを選択してアペンドします。これでシーンにエンプティが作成されます(画像5:②)。
データを適用したいボーンをポーズモードで選択して、プロパティ:Bone Constraints ⇒ Add Bone Constraint ⇒ Copy Transforms を適用して、Copy Transforms の Target に先ほど追加したEmptyを指定しておきます。するとEmptyの位置にコントローラーが移動するはずです。画像5:③に使用するセットキーのみを残してボーンにアニメーションを適用します。
ポーズモードのPoseメニュー ⇒ Animation ⇒ Bake Action... の順に適用すればデータが使えます(画像6)。コンストレイントでコピーしたすべてのモーションが一つのActionsになります。
| 画像6:Back Action |
|---|
![]() |
読み込ませたモデルは映像3になります。
| 映像3:適用後のアニメーション |
|---|
![]() |
この後、Copy Transformsのコンストレイントとコピー元を削除してOKです。
キーを扱いやすくする
大量のデータを1フレーム毎に編集してみたが、大変だったので次のようにした。
画像7:①のkeyメニュー ⇒ Interpolation Mode ⇒ Bezier で通常のキーフレームと同じにする。次に、keyメニュー ⇒ Density ⇒ Decimate(Ratio) で大量のキーフレームをある程度消すようにした(画像7:②)。左右にスクロールすれば何%消せるかを調整できます。大体80%削減すれば扱いやすくなると思います(画像7:③)。
| 画像7:Back Action後の処理 |
|---|
![]() |
まとめ
奥行情報は確かに得られるが、撮影時に移動するのはやめた方がいいです。理由は、先ほど記載した「視界の外」や「遮蔽物」によって安定したデータが得られないためです。データによってはビックフットやビックハンドになる。さらに、背骨側に顔が向くこともある。なので、狭い範囲で上半身だけ映し、すべてのモーションを腕だけで表現すればいいです。
顔や手の詳細なモーションキャプチャーもリップシンクもしてみたい。やりたいことばっかりだ。










Discussion