RICOH THETAの全天球動画を正距円筒図法へFFmpegで変換する


RICOH THETAの全天球動画を正距円筒図法動画にffmpegを用いて変換する方法を共有します。

結論

FFmpegのmasterブランチのビルド( Windows&Mac:[1], Linux:[2] )を入手した上で、下記コマンドを実行することで2つの魚眼動画を正距円筒図法動画へ変換できます。

ffmpeg -i INPUT.MP4 -y -vf crop=1920:960:0:0,v360=dfisheye:in_pad=0.112:roll=-90:e:pitch=90,crop=1920:840:0:0,pad=1920:1080:0:0 -c:a copy OUTPUT.mp4

解説

FFmpegに全方位カメラ向けのライブラリv360が昨年の9月辺りにmasterブランチに入りました。
ただし、2020/03/08時点の最新版である4.2.2には含まれていないため、masterブランチのビルド( Windows&Mac:[1], Linux:[2] )を用いて作業をする必要があります。

ビデオフィルタオプション -vf のそれぞれの意味は下記のとおりです。

  • crop=1920:960:0:0
    • 入力画像は1920x1080であるが、実際に魚眼画像がある1920x960の範囲のみに限定する必要がある
  • v360=dfisheye:in_pad=0.112:roll=-90:e:pitch=90

    • dfisheye : Dual Fisheye Movie として入力画像を解釈する
    • in_pad=0.112 : 魚眼動画のマージンを無視する
    • roll=-90 : roll角度調整(お好みで調整)
    • e : 正距円筒図法に投影して出力する
    • pitch=90 : pitch角度調整(お好みで調整)
    • この他にも必要に応じてオプションを追加
      • interp : gaussian, lanc など高次な補完処理を用いても良いかもしれません(標準は linear )。
  • crop=1920:840:0:0,pad=1920:1080:0:0

    • 取っ手部分がノイジーなので黒く塗りつぶす
    • 不要な場合はフィルタオプション ,crop=1920:840:0:0,pad=1920:1080:0:0 をまるごと削除すればよい

変換結果例

課題

つなぎ目が不自然なのでSLAMとかにかけるときに副作用がありそうです。
in_pad を少なめにとった上で、それらの境界を自然にブレンドをしたいのですが、該当する実装を探せていません。

背景

RICOH THETAシリーズは、未だにライバルが少ない全天球撮影を簡単に行える優秀なデバイスですが、動画撮影の場合に正距円筒図法に投影されない動画データが吐き出されます。魚眼カメラ2つの映像を生でエンコードしたもの(Dual Fisheye
Movie)となっています。
一般的に多くのサービスや動画処理で使われているのは正距円筒図法(Equirectangular)に投影したものを入力としているので、そのままでは扱えません。

この問題を解決するために、RICOHの本家のツールが存在します。変換自体の機能は充足しますが、GUIでの操作が前提となっており、大量変換・自動変換に不向きであるという問題があります。また、Linuxに対応していない点もSLAM実装に投げるなどの環境実装上、大いにマイナスです。

そこで、メジャーなOSSでの実装、かつ持続可能な調達が見込める方法を調査した結果が本記事になります。
ほとんどまとまった言及がなかったのですが、唯一具体的なQ&AがStack overflowに1件ありました。ただ、この記述どおりではうまく行かなかったため、試行錯誤をした結果が上記のコマンドになります。

参考文献

  1. Download FFmpeg
  2. FFmpeg Static Builds
  3. FFmpeg Filters Documentation # v360
  4. RICOH THETA ダウンロード
  5. Is there a fisheye or dual fisheye to equirectangular filter for ffmpeg? - Stack overflow