前回の記事で、リアルタイム動画配信の仕組みに、THETAという360度パノラマ画像を撮影できるカメラを導入する方針に転換するというお話をしました。
今回は、THETAとAndroidを接続して、実際に画像を取得し、端末内に保存してみましたので、その内容をまとめます。
■THETAと接続する方法
THETAで撮影した画像を取得したり、THETAで映している映像をリアルタイムに取得する方法は、3つ提供されています。
1)WiFiで接続する
THETAには、WiFiのアクセスポイントが組み込まれています。
各端末(PCや携帯端末)で、アクセスポイントをTHETA内蔵のものに切り替えた後、
各種IFを実行することで、画像を取得することが出来ます。
カメラに映っている画像をリアルタイムに受信する場合の仕様は、以下の通りです。
画像の形式:EquirectangularのMotionJPEG形式
画像サイズ: 640×320
フレームレート: 10fps
2)USBで接続する
THETAと各端末を、USBで接続すると、ライブストリーミング形式で、
カメラに映っている画像をリアルタイムに受信することができます。
USBの仕様は以下の通りです。
動画の形式:Dual-FisheyeのMotionJPEG形式
画像サイズ: 1280×720
フレームレート: 15fps
3)HDMIで接続する
THETAと各端末を、HDMIで接続すると、ライブストリーミング形式で、
カメラに映っている画像をリアルタイムに受信することができます。
今回、このTHETAと接続する端末はAndroidになるため、HDMIでの接続は対象外になります。
■WiFiとUSB、どちらがよいのか
カタログスペックでは、USB接続の方が、明らかに性能が高いことがわかります。
また、THETAで撮影している画像を、Androidで受信することが目的ではなく、その後サーバに画像をアップロードして動画を作成する必要があると考えたとき、THETAとの接続にWiFiを利用すると、アクセスポイントがTHETAに向いてしまうので、サーバへのアップロードにはWiFiが使えないというデメリットもあります。
このため、THETAとAndroidはUSBで接続することにしました。
■画像の形式(Equirectangular、Dual-Fisheye)について
360度パノラマ画像には、多くの種類があり、THETAでは接続の方法によって、Equirectangular か Dual-Fisheye 形式の画像を取得できます。
Equirectangular というのは、一般的に見かける世界地図の形式で、360度パノラマの世界を球体と考えたときに、緯度と経度を等間隔に、直角に交わるように描画したものになります。
クライアント側では、球体のオブジェクトに対して、この形式の画像を張り付けるだけで、360度パノラマの世界を作ることができます。
<図1 Equirectangular の画像>
Dual-Fisheye というのは、カメラのレンズに映っていた画面を、そのまま出力した形式になります。
一枚の画像に、前面と背面の2つのカメラで撮影した画面が、横に並んでいる形になっております。
クライアント側で、この画像から 360度パノラマの世界を作る際には、球体のオブジェクトに画像を張り付ける際に、Equirectangular 形式に変換を行う必要があります。
<図2 Dual-Fisheye の画像>
THETAでは、USB / HDMI 接続時の、ライブストリーミングでは Dual-Fisheye の形式となっているため、クライアント側で、360度パノラマの世界を作成する際に、ひと手間かけることになります。
■THETAとAndroidをUSB接続するときに気を付けること
いくつか注意する事項があります。
1)どのAndroid端末でも、USB接続できるわけではない
THETAをUSBで接続した場合、Android端末側が「ホスト」にならなければならないです。
このため、USBホスト機能を有している端末でなければ、USB接続は行えません。
2)THETAとAndroidを接続する線を、別途用意する必要がある
THETAについているUSBポートは、USB Type-B になっています。
これとAndroid端末を接続する場合は、別途、OTGケーブルが必要になります。
ただし、今回弊社で用意したAndroid端末は、Nexus6P で、この端末のUSBポートは、Type-Cになっています。
この場合は、Type-B と Type-C を接続するケーブルを購入すればOKです。
3)販売元であるRICOH様から、USB接続に関するSDKは提供されていない
そもそも、USB接続やHDMI接続については、PC等での接続を想定されているものと思います。
THETAとしてSDKが提供されておりませんので、別途、AndroidでUSBを接続する方法を採択します。
今回は、UVCCameraというライブラリを利用させていただきました。
■実際に画像を取得して実測してみました
UVCCameraのライブラリの利用方法については、本家UVCCameraに記載がありますし、サンプルプログラムも付属していますので割愛します。
今回は、あくまでも画像をどの程度の速度で保存していけるのかという観点で、以下のように実装しました。
1)THETAとAndroid端末をUSB接続し、USBストリーミング配信を行う
THETAから画像が送信されるので、その内容をTextureViewに反映します。
2)TextureViewのデータをRGBAで取得して、JPEG画像として端末内に保存します
このとき、ファイル名を<ミリ秒>.jpgとします。
3)保存された画像のファイル名を並べて、fpsがどの程度、出ているのか見る
この結果、処理速度にばらつきはありますが、大体10fpsの速度が出ることがわかりました。
元々の速度と比較すると、
元々:画像サイズ「512×384」で20fps
THETA利用後:画像サイズ「1280×720」で10fps
となっており、画像サイズが約4倍になっているにも関わらず、fpsは半分までしか低下していません。
さらに、元々の画像とは違い、保存している画像はすでに、360度パノラマ画像になっています。
速度があまり低下していないのは、当初ボトルネックとなっていた画像処理周りの一部が、THETA側に移譲されたことが大きな要因です。
また、Android内蔵カメラを利用していた場合、そちらにもCPUやメモリが割かれることになりますので、それが取り除かれたことも大きいと考えています。
今後、保存画像をアップロードする(通信する)処理を追加することで、このfpsが低下するかもしれませんが、現段階での印象としては、THETAを導入することで、360度パノラマ動画をリアルタイム再生することに、非常に現実味が出てきたかなと思います。
<図3 THETAとAndroidをUSBで接続しています>
■次回以降
次回は、この保存した画像をサーバへアップロードし、動画を作成してみて、どの程度のfpsが出るのかまとめようと思います。
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。