XREAL Beam Proの空間ビデオからフォトグラメトリする

サングラス型の反透過ARグラスを出しているXrealが
ステレオカメラ搭載のAndoroid端末Beam Proを出していたので
簡易的な３Dスキャンに活用できないかと　試しに購入してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/3466cdc6-66e2-8cef-8750-b707353602a2.png)
ステレオカメラを活用して3Dモデル作成するテストの覚書です。
普段はTLで技術情報を眺めているだけで 翻訳片手なので間違いが多いかもしれません

## XREAL Beam Proの撮影画像について
撮影画像は　左右のカメラ画像を横並びにしたもので記録されるようで
動画 は片目**1920\*1080**で  **3840\*1080**
静止画は片目**3844\*2880**で  **7688\*2880**になるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/1fa9b659-51aa-6449-a2cf-a00a250f8187.png)

:::note
今回はまずは動画撮影したものから画像を切り出してテストをしています
:::

## 動画からのフレームの書き出し
ffmpegを使って動画のフレームを一定間隔で抜き出して
横並びの左右片目づつ切り抜きするバッチファイルを作成してみました
```batch: 4f.bat
rem 動画の場所にフォルダ作成
md %~dp1sbimgL
md %~dp1sbimgR
rem 秒間4枚画像を書き出し
%~dp0ffmpeg\bin\ffmpeg.exe -i %1 -vf crop=1920:1080:0:0 -r 4 -f image2 %~dp1sbimgL\img%%06d.jpg -vf crop=1920:1080:1920:0 -r 4 -f image2 %~dp1sbimgR\img%%06d.jpg
pause
```
動画のある場所に 左右それぞれのフォルダを作成し
秒間４フレームで切り出して　左右振り分けての画像を保存する処理にしています

### 

動画から切り出したものを青赤ステレオ風で重ねて画像を比較してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/8e91e0aa-7cc6-c466-f788-649c3868b5cc.png)

大体3ｍ先で15pixel程度　10m先の軒先で5pixel程度の平行移動が確認できます
ただ動画なのもあって拡大画像で確認してみるとブロックノイズが気になりますね


## COLLMAPでの解析
まず CollmapでSfM (Structure-from-Motion)してみました
SfMとは画像から抽出した特徴点からカメラの移動位置や　特徴点の立体位置を再構築する処理のことです
Colmapは制度が良く高速なのもあって　学術的な解析でもよく使われるようです

Collmapでの解析ではまず　File>NewProjectで
プロジェクトのデータベースファイルの作成と画像のあるフォルダの指定をします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/9c5b665f-ede5-5447-22e2-cff1166d7925.png)
Reconstruction>Automatic Reconstruction で開くウインドウで
各種設定をすることでで解析開始です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/364ef2a2-9db8-0844-ed48-e14e426dfd47.png)
動画から連続画像を作ったので　Data typeをVideo framesに設定して
画像のある親フォルダ下に左右のカメラで画像を振り分けたサブフォルダを作っておいて
Shared intrinsics per sub-folder　をチェックすることで　別の一連の画像として解析するようです

今回の再構築した点群データはこんな感じでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/1b18d424-1ad6-806f-1aae-0e52e3a4a19d.png)
後半で左右のカメラの動きに解析違いが出来てしまっている様子ですが点群だけも全容が分かる程度には構築できています
今回の解析では13th Gen Core i7ノートで9分強　ポータブルゲーミングPCで20分の解析時間と
少なくとも自分のやりたいことはできそうです

左右のカメラの相対位置を拘束する設定がないか　調べる必要がありそうです

## Meshroomでのフォトグラメトリ
複数写真から立体を生成するフォトグラメトリソフトの一つに AliceVision Meshroom という
オープンソースのソフトがあります
ステレオカメラに対応した処理があるようなので試してみました

### Meshroomのマルチカメラリグの設定

https://github.com/alicevision/meshroom/wiki/Multi-Camera-Rig

meshroomはrigフォルダ下に番号分けしたフォルダを置くと
フォルダ下の同一番号の画像を同期して撮影された画像として処理してくれるようです

ただ、画像のExif情報のBodySerialNumberが別である必要もあるようです
幸いにも　Windowsのプロパティでも複数ファイルExif情報を一括編集できるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/115611c4-a188-ce14-c9be-b2de98a08007.png)
IDが被っていさえいなければいいので　片目分のデータに適当な値を入れればいいだけのようです

後はデフォルトの設定で処理を実行してみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/18f60d79-3db3-2fc3-41e5-2ea2e2181ba7.png)
枚数や1080p動画から書き出した画像の精度と考えると比較的いい仕上がりなのではないでしょうか

## カメラの撮影軌跡について
フォトグラメトリの素材撮影において、より綺麗な結果を得るには
カメラの位置を変えずに回転する撮影（パン）を極力減らして画像同士で重なる部分が8割程度あるようにするとよいようです

今回のテストでは　あえて撮影位置をあまり移動せずに左右の首振り中心で撮影も試してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/4916d3dc-bfe8-3d25-ed58-90028531b911.png)
上が片目分の平行移動画像
下が両目撮影の首振り画像　の結果。入力枚数を揃えたものです

従来通り平行移動を心掛けた方が結果が良いようですが
左右に平行移動した画像のペアがある分　カメラ１つで首振りするよりはまともな結果になってるかもしれません

雑な検証ですが　個人的には実りの多い検証でした
まだ把握していなかった設定も含め　引き続き色々試していきたいと思います