前回のReality Captureの記事に引き続いて、Metashape(以下MS)のシンプルなフォトグラメトリの方法を覚え書きしておきます。

Agisoft社のMSは179ドル(約2万円)のスタンダード版を買えば、とりあえずフォトグラメトリで3Dモデル作る分にはほぼ制限なく使用することができます。
なんかGIS系の機能を使うには3499ドルのプロ版が必要になります。

フォトグラメトリソフトの中では割とお買い得な気がします。
ちなみに国内代理店のオーク社で購入すると税抜き2万5千円(税込み2万7500円)です。

https://oakcorp.net/shop/item/11344/

オーク社は、プロ版については日本語マニュアルを用意してくれてるそうですが、スタンダード版についてはよく分かりません。
Agisoftで直接買うより割高ですが、日本語マニュアルが付いてるならアリっちゃアリかもですが、無いなら無意味に高い(まあそれでも日本語メールサポートはあるけど)ですね。

マニュアルは英語マニュアルをDeepL翻訳に突っ込むみたいな方法もアリでしょう。

いきなり購入しなくても、評価版をダウンロードして無料で機能を試せます。
全ての機能が使えますが、プロジェクトの保存やモデルの出力はできません。

MSは結構良ソフトだと思うのですが、実は今となってはオススメしづらい点があって、それはAgisoftがロシアの会社だという事です。

ロシアの会社のソフトって、今のご時勢柄、この先安心してずっと使っていけるんだろうか?みたいな…。

というかすでに先日、プロ版のアクティベート認証ができなくなるサーバートラブルが発生していました。

一応この問題はすでに解決していて、オーク社による販売も継続しています。

まあその辺の事情はさておいて、とにかく今回の記事ではMSの簡単な使い方をメモ書きします。

Metashapeの簡単な使い方

オーク社のチュートリアルを参考にしました。↓

動画のインポート

まず、スマホで撮影した4k動画を突っ込みます。
メニューで「ファイル」→「インポート」→「動画をインポート」を選択すると、エクスプローラが表示されるので動画を選んでください。
すると、このようなインポート画面が出ます。↓

「書き出しフォルダ」で動画から画像を切り出して保存するフォルダを指定します。

Metashapeは動画からカメラの移動量を自動的に分析して画像を切り出してくれます。
フレームステップを”大きい”、”中間”、”小さい”の3択で、どれくらいカメラが移動するごとに画像を切り出すのか選べます。
”大きい”で試したら、1分の動画で300枚くらい切り出されました。つまり1秒当たり5枚くらい切り出されてます。
ちょっと多すぎるんじゃないかという気もしないでもないです。
フレームステップに数字を入力すると、何フレームに1枚画像を切り出すかを手動で決められます。
30にすれば1秒に1枚切り出されます。それくらいでも良さそうです。

前回の記事でも書きましたが、私は最初動画のインポートに失敗していましたが、K-lite code packというコーデックをインストールしたら直りました。

https://www.agisoft.com/forum/index.php?topic=9965.0

アライメント

インポートが終わったらアライメントします。

「ワークフロー」→「写真のアラインメント」を選ぶと、設定画面が出ます。
とりあえずデフォルト設定のままで「OK」を押すと、アライメント処理が始まります。

アライメントが終わるとこのように、なんかざっくりしたポイントクラウド(点群)と、カメラの撮影位置が青い四角の集まりとして表示されます。

↑私が被写体の周りをグルグル回りながら動画を撮った軌跡がよく分かりますね。

高密度クラウド構築

アライメントで生成されたポイントクラウドは、プレビュー用みたいな感じだったので、本番用の高密度ポイントクラウドを生成します。

「ワークフロー」→「高密度クラウド構築」を選んで、これまたデフォルト設定で「OK」します。

完了すると、高密度なポイントクラウドが生成されてます。

ちなみに画面上部の9つの点のアイコンを押すと高密度クラウドが表示されて、その右の4つの点のアイコンを押すと低密度クラウドに切り替わります。
カメラアイコンは、アライメントの表示、非表示切り替えです。
ピラミッドと日の出みたいなアイコンはメッシュ表示切替です。

メッシュ構築

次はメッシュを生成します。

「ワークフロー」→「メッシュ構築」を選んで、またまたデフォルト設定で「OK」を押します。

完了するとメッシュが生成されてます。

↑うわ、これ失敗だな…。

テクスチャ構築

この時点で失敗だったら放棄しちゃえばいいんですが、今回は一応最後までやります。

「ワークフロー」→「テクスチャ構築」を選びます。

「テクスチャーサイズ」の項目で出力するテクスチャサイズを選べます。
「穴埋めを有効にする」のチェックが入ってなかったら入れてください。
そしてOKを押します。

完了するとテクスチャが生成されてます。↓

モデルエクスポート

完成したので、3Dモデルとしてエクスポートします。

「ファイル」→「エクスポート」でobjファイルをエクスポートできます。
これで作業完了です。

アライメントの修正

まあ基本的なフォトグラメトリ作業は上の通り、マウスポチポチするだけでできちゃいますが、アライメントの際に処理が上手く行かなくて、アライメントできなかった写真が出てくることがあります。
これはもう一回アライメントし直してやれば割と上手く行くことがあります。

アライメントの終了時に、アライメント失敗した写真がある時はメッセージが表示されるので、その際は画面左のワークスペース欄を見ると、アライメント失敗した写真は”NA”(Not Aligned)という表記がされてます。

NAになってる写真をまとめて選択して、右クリックして「カメラのアラインメントをリセット」を選びます。

もう一回右クリックして、「選択したカメラのアラインメント」を選ぶと、もう一度アライメントさせることができます。

これでNAが消えればアライメント成功です。

割とこれで上手く行く事も多いので、やり直しただけで行けるんだったら自動でそこまでやっとけやと思わなくもないです。
もう一回アライメントしてもNAだったらしょうがないので諦めましょう。

バッチ処理

というわけで、MSは割と簡単に使用できる事が分かりましたが、しかし使っている内に気になる点が出てきます。

最初に動画をインポートすると、しばらく待たされますが、いつの間にか終わってて、指示待ち状態になってます。
それに気付いて、じゃあ次はアライメントをさせると、これまた待たされて、いつの間にか終わってて、指示待ちになります。
じゃあ次は高密度クラウド構築…。
そんな感じの繰り返しで、MSは動画1本を処理するために5回も指示待ちになります!
お前、指示待ち人間かよ?

本当だったら、外出中とか寝ている間に大量の動画をまとめて処理させておきたいのに、イチイチ指示待ちされちゃうと、10分ごとに起きてマウスポチポチするハメになってしまいます。

例えばレストランに行って、最初に前菜だけ注文を訊かれて、前菜が来たら次はスープの注文を訊かれて、スープが来たら次はメインディッシュの注文…ってなったらどう思いますか?
こう思うはずです。
最初に全部注文訊いとけや!!

そんなわけで、MSにはちゃんと、最初に全部注文を訊いておいて全部やっといてくれる機能があります。
バッチ処理機能です。

バッチ処理について参考になる動画はこちらです↓

「ワークフロー」→「バッチ処理」を選ぶと、こんなウインドウが開きます。

↑パッと見、意味が分かりませんが、これがレストランで言うところの注文リストに相当します。
左下の「追加」ボタンを押します。

バッチ処理では、動画や写真のインポート自体は自動ではできないようなので、そこは手動でやるとして、その次にやるのはアライメントです。

というわけで、ジョブ追加ウインドウでは、ジョブタイプから「写真のアラインメント」を選んで、OKを押します。↓

すると、バッチ処理ウインドウに”写真のアラインメント処理”が追加されてます。↓

同様の要領で、「高密度クラウド構築」、「メッシュ構築」、「テクスチャー構築」も追加します。↓

最後に、「モデルをエクスポート」を追加しますが、ここでは出力するパスを入力する必要があります。
とは言え、出力パスを決め打ちにすると、複数のモデルを書き出す時に全部同じ名前になって上書きされてしまいます。

MSでは特殊なテンプレート名が用意されてます。
たとえば、{imagefolder}は出力時に入力写真のフォルダパスに置き換えられます。
また、{chunklabel}はチャンク名に置き換えられます。
つまり、出力パスに「{imagefolder}/{chunklabel}.obj」と指定すると、入力写真のフォルダ内に、チャンク名の名前で保存してください、という意味になります。(テンプレート名の詳細についてはMSのマニュアルPDFを参照してください)

チャンクと言うのはワークスペースのこれです。↓

チャンク名が出力モデル名になるので、分かりやすいように右クリからリネームしておきましょう。

あとは、写真や動画が入力された状態で、バッチ処理ウインドウで「OK」を押すと、指定したジョブの順番で、最後まで自動で処理してくれます。
便利ですね。

ただし、バッチ処理はたとえばアライメントに失敗してる時なんかでも問答無用で勝手に処理を進めちゃう点に注意してください。

複数の動画ファイルをまとめて処理する

一つの動画ファイルについてはバッチ処理で全部自動で処理してくれるようになりましたが、動画が10個ある時は、10回操作しないといけないので、まだ面倒な気がします。

その場合、10個の動画を10個のチャンクとしてあらかじめインポートしておけば、あとはバッチ処理で全部まとめて一つずつ自動処理させることができます。

ワークスペースで右クリすると、「チャンクを追加」できます。

チャンクを追加したら、またそこに動画をインポートします。
これを繰り返してすべての動画をそれぞれのチャンクにインポートします。

あとはバッチ処理を開始すれば、全てのチャンクに対して自動で処理が始まります。
ラクチンですね。

最初の動画インポートだけ手動なのがちょっと面倒ですが、処理自体は全自動になったので、これで寝ている間でもバリバリ大量の動画を処理させる事ができます。

おわり

今回の記事では、Metashapeの簡単な使い方と、バッチ処理させる方法について書きました。

バッチ処理は便利ですが、ここまで来たら動画のインポート処理自体も自動化したいなあ…。
実は、MSのプロ版はPythonから操作出来て、もっと色々と細かい制御をさせられるそうです。
そっちなら完全自動化ができるかも。

ちなみに、Reality Captureはバッチ処理みたいなのってないの?というと、CLIでコマンドラインから操作する方法があります。
それについてはおいおい調査しておきたいですね。

フォトグラメトリは同じ動画でも解像度や枚数によって結果が変わってきたりするので、例えば一つの動画に対して10フレ毎に切り出した場合と20フレ毎、30フレ毎、みたいなパターンでそれぞれバッチ処理させてみて一番出来がいいモデルを採用する…みたいな方法もアリかもしれません。