Ricoh THETA S Real Time Stitching
2015.12.11
Category
Tags
最近、RicohのTHETA Sを購入しました。
USB/HDMIでPCに繋いでライブストリーミングできるとのこと。要はPCに繋げたら外部カメラとして認識されるということですが、
「おお、リアルタイムで全天球映像が見れるのか!」と盛大な勘違いをしていました。
現実はそう甘くはなく、得られる画像は下のような感じ。それぞれのレンズで撮った映像が横並びになっている状態です。
これをなんとかリアルタイムに全天球映像にできないものかといろいろ調べた結果、カメラの映像をフラグメントシェーダで正距円筒図法 (equirectangular)に変換してあげれば、以前書いた記事と同じ手法で球の内側に貼り付ければ実現できそうということがわかりました。
上記のシェーダがつくれればWebGL (Three.js)でさくっとできそうと思ったので、今回はかねてから勉強しようと思っていたopenFrameworksで実装してみました。
なれない道具でわからないことをやるのはかなり骨が折れましたが、なんとか形になりました。
まずは魚眼レンズの映像を正距円筒図法にするところからですが、どうやら魚眼レンズにもいろいろ種類があるらしい。。
wikipediaによると一般的な魚眼レンズは等距離射影方式とのことなので、
このへんの数式を使用してなんとなくシェーダはできたっぽいのですが、
なんかつなぎ目が全く合わない。。
おかしいなと思って調べていたら、THETAのレンズはステレオ投影 (立体射影)というものらしい。このページに書いてあった。
なので今度はこのへんの数式を使用して、シェーダを書き直したところ、THETAが内部でやってる処理のようにほぼつなぎ目がわからないとまでは言えませんが、なんとなくそれっぽいものができたっぽい気がしなくもありません (ふわふわ)。
というわけで、シェーダを通した結果、こんな感じのequirectangularの映像が得られます。
これを球の内側に貼り付ければリアルタイム全天球映像ビューアの出来上がりです。
openFrameworksを自由に使いこなせてないですが、マウスドラッグで向き変更、マウススクロールで球の大きさを変更できるようにしています。
また、アニメーションにイージングをつけるため、ofxTweenというアドオンも使用しています。
(服が違うのは、後日アップデートしたからです。)
2台のPCと2台のTHETA Sがあれば、全天球チャットとかできそう。
個人的にopenFrameworksは習得したい技術なので、これからもいろいろ作ってみたいと思います。あとunityも覚えたい。
webコンテンツの場合って、ブログに載せたいときはURLを貼り付ければおしまいだけど、ブラウザで見れないものを楽しげに見せるのってめんどくさいんだな。。
とりあえず、QuickTimeを使って画面録画をする方法は覚えました。