iwasiblog

イワシブログ - Activity log of an iwasi -

360度動画を使ったフォトグラメトリ(OpenMVG / OpenMVS)

フォトグラメトリでは,一般に良いカメラを使い照明条件など様々な要素に気を遣いながら大量の写真を撮影する必要があります.一方で,3Dモデルやテクスチャの綺麗さをある程度犠牲にしても手軽さを追求できないかと考えた時,全周を一挙にかつ高速で連続して撮影できる360度動画は良い選択肢となります.
360度動画を使用したフォトグラメトリにはいろいろと先行事例がありますが,高級なソフトウェアを使わずなんとかできないかと考えた結果,OpenMVGとOpenMVSにたどり着きました.公式で手順が用意されているので,ドキュメントをなぞってやってみた,という記事です.

得られたもの

youtu.be

準備するもの

下の3つはどれもWindows用にビルド済みバイナリがあるのでそれを使用します.

やること

  1. 360度動画を撮影する
  2. ffmpegで連番画像として出力する
  3. OpenMVGとOpenMVSで3次元再構成をする

1. 360度動画を撮影する

今回は,カメラにGoPro MAXを使用しました.
カメラを自撮り棒で頭上に配置し,歩いて2分35秒(30fps)の素材を撮影しました.

2. ffmpegで連番画像として出力する

以下のようなコマンドで連番画像化します.-rに渡すパラメータはフレームレートで,適度に枚数を少なくします(全フレームだと枚数が多すぎて処理に適さないため).

$InputVideo = "Path to 360 video"
$ImgOutputDir= "Path to directory for output images"

./ffmpeg.exe -i ${InputVideo} -vcodec png -r 1.5 ${ImgOutputDir}\img_%03d.png

これによって,動画から正距円筒図法の静止画が235枚得られました.

3. OpenMVGとOpenMVSで3次元再構成をする

OSSを使って3Dモデル化していきます.
ただし,CPUとメモリのリソースを大量消費するうえ処理時間もかかります.
*各工程で使用するパラメータはデータによって変えたほうが良い可能性があります.

3.1 OpenMVG

OpenMVGで360度動画を処理する例が公式に用意されているのでそれに従います.

$MVGOut= "Path to output directory for OpenMVG"

./openMVG_main_SfMInit_ImageListing.exe -i ${ImgOutputDir} -o ${MVGOut}\matches -f 1 -c 7
./openMVG_main_ComputeFeatures.exe -i ${MVGOut}\matches\sfm_data.json -o ${MVGOut}\matches -m SIFT -p HIGH
./openMVG_main_ComputeMatches.exe -i ${MVGOut}\matches\sfm_data.json -o ${MVGOut}\matches -g a
./openMVG_main_IncrementalSfM.exe -i ${MVGOut}\matches\sfm_data.json -m ${MVGOut}\matches -o ${MVGOut}\reconstruction
./openMVG_main_openMVGSpherical2Cubic.exe -i ${MVGOut}\reconstruction\sfm_data.bin -o ${MVGOut}\reconstruction\cubic
./openMVG_main_openMVG2openMVS.exe -i ${MVGOut}\reconstruction\cubic\sfm_data_perspective.bin -o ${MVGOut}\reconstruction\cubic\scene.mvs -d ${MVGOut}\reconstruction\cubic\openmvsImgs

3.2 OpenMVG

先の手順でOpenMVSで扱う点群の形式になっているので,そのまま3Dモデル化の手順を踏みます.
OpenMVSの使い方も公式のものを参考にして進めます.
今回は,メモリ使用量と実行時間を抑えるため,以下のパラメータを使いました.

  • -d 5 : 三角測量時に異なる2点とされる最小距離を広げて,結果の頂点を少なくします.
  • --gradient-step 2 : 処理のイテレーション回数を減らします.

それでも,32GBの物理メモリでは足りずすごい大きさのページファイルが作成されました.

$MVSOut= "Path to output directory for OpenMVS"

./DensifyPointCloud.exe ${MVGOut}\reconstruction\cubic\scene.mvs -w ${MVSOut}
./ReconstructMesh.exe ${MVSOut}\scene_dense.mvs -d 5 -w ${MVSOut}
./RefineMesh.exe ${MVSOut}\scene_dense_mesh.mvs --gradient-step 2 -w ${MVSOut}
./TextureMesh.exe ${MVSOut}\scene_dense_mesh_refine.mvs --export-type obj --empty-color 3289650 -w ${MVSOut}

結果

30fps,2分35秒の360度動画から,冒頭の動画のような3Dモデルを作成することができました.
処理時間:441分(Core i7-9700K / 32GB RAM / GTX1080Ti)

3Dモデル情報