RICHO THETAとmeshroomでフォトグラメトリ実験

事前準備

thetaの画像をmeshroomに食わせられる画像に変換するpythonスクリプトを実行できる環境を整える。Windows上のAnacoda環境でやっています。opencvはcondaパッケージから入りますが、piexifやrawpyはpipでインストールする必要があります。

https://gist.github.com/akirayou/8b671f8c1d9396994dd3f21b794e7f10

このスクリプトではカメラモデルを”RICOH:CUTED”という名前で作るので、Meshroom-2021.1.0\aliceVision\share\aliceVision\CameraSensors.dbに以下の一行を加えて、センサーサイズを設定しておきます。

RICOH;CUTED;8.8;digicamdb

実行方法

  1. THETA撮影時にRAW+JPGで撮影
    THETAといえど普通のカメラと同じく片一方のレンズで見えてる領域の6~8割がオーバーラップしながら横移動しないとフォトグラメトリできないので注意。
  2. 上のpythonスクリプトをDNGとJPGファイルがある場所で実行して、DNGファイルにある2枚がならんだファイルを分割する。(
  3. rigフォルダの中に分割されたJPGファイルが出来るので、それを突っ込む
  4. meshroomの設定:CameraInit
    Intrinsicsの 2elementsの所を開いて、Camera Type:fisheye4であることを確認
  5. meshroomの設定:FeatureExtraction
    Describer Typesの設定でデフォルトはSHIFTで、写真枚数が少ない時のmeshroom的なお勧めはSHIFT+AKAZE。だけど、計算速度が欲しい人はAKAZEのみにして、Describer Density をhighにするのもおすすめ。
    なお、
Cameraの設定
FeatureExtractionの設定

Startして計算させた結果以下のようにカメラマークが背中合わせに撮影した枚数でてきたら、Camera設定/FeatureExtractiの設定自体はOKだと考えられる。

meshroom向け画像ファイルの話

THETAの画像は通常正距円筒図(equirectangular)になっている。これを直接フォトグラメトリに使うことはできない。正距円筒図からピンホール画像を切りだすソフトは存在するが、THETAが近距離では歪みをもつせいか、私の環境ではあまり芳しくない結果になった。

THETAはRAW形式で撮影するか、double fisheyeプラグインを使うと以下の図のように撮影したままの画像を取得できる。今回はRAWファイルを使う方法をとった。

RAWファイル(DNG)の例

単純にコレを2つに切り離して、やれば良いがそのままだと、黒いケラレの部分がエッジとして特徴量抽出されてしまう。そうするとカメラ位置の推定の邪魔になってしまう。なので、この切り離しソフトでは端にぼかしたマスク(vignette)を追加している。

また画像出力時にカメラRIGとして出力することもできるが、meshroomは二つのカメラが同一の特徴を全く捉えないRIGを処理させると、StructureFromMotionまでは動くがその後のdepth推定の準備でコケるので、今回は独立のカメラであるとして、フォトグラメトリを実行した。

meshroomは焦点距離やカメラIDといった情報を要求するので、thetaのjpegファイルのexifをコピーして改変し、出力ファイルにexifを設定している。なのでこのスクリプトを実行する際にはDNGファイルといっしょにJPEGファイルも必要になっている。

実行例

室内17ショットを入力

入力画像例

このような感じでカメラ位置が推定されて

カメラ位置推定結果例

こんな感じで立体が再構成された。17ショット=34枚の画像ではこんなもんかな。という出来。