THETA新機能バースト撮影方法

こんにちは。 @mShiiina です。
今回は、[RICOH THETA Z1のファームェア V2.00.1](https://support.theta360.com/ja/download/firmware/z1/) から搭載された新機能、バースト撮影について解説します。

## バースト撮影とは

まず、バースト撮影について説明します。
THETAにはもともとインターバル撮影という、連続して写真を撮影する機能があります。
インターバル撮影は一定間隔(２秒間隔以上)で撮影する機能であり、タイムラプス動画を撮影したいときなどに使える機能です。
バースト撮影は連続して写真を撮影するというところはインターバル撮影と同じですが、撮影間隔が最短で数十ミリ秒で可能な撮影です。
さて、バースト撮影はどんなときに有効な撮影方法なのでしょうか？
よく使われるのは小さい子どもや動物など自由に動いてしまう被写体を撮影するときに、ベストショットを逃さないために撮影します。短い間隔でたくさん撮影することで、そのうちのどれかはいい写真になるはず！という心意気で撮影します。
![MicrosoftTeams-image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263023/8edd5c55-7963-ecd2-50e0-db01b74e55f9.png)


## バースト撮影の概要

バースト撮影について、api.ricohにドキュメントが追加されています。詳細は以下リンクから辿ってください。
https://api.ricoh/docs/theta-plugin-reference/camera-api/#burst-capture-mode
余談ですが、ドキュメント先頭にページ内リンクがついたので、目的の説明を探しやすくなっています。

簡単にこのAPIの特徴を咀嚼して記載しておくと、以下となります。

- 1枚から9枚まで奇数枚の指定を行えます。
- 撮影間隔は、シャッター速度が1/30より短い場合、最短で30ミリ秒くらいにできます。
- 枚数に9枚の上限があるのは、高速撮影を実現するためRAMにため込むのですが、RAM容量には限界があるからです。
- 奇数枚指定なのは、このAPIが、高速ブラケット撮影に主眼を置いて作られたためです。HDRIの元データ撮影に役立ちます。
- データ形式はJPEGだけでなくDNGでも保存することができます。（ただしRAMの中に保存されています）

## THETAでの実装方法

バースト撮影のAPIは、WebAPIを提供していないため、スマホアプリ等から呼び出して使うことができません。
本体でのCameraAPI([こちらの記事](https://qiita.com/KA-2/items/cef05a4960663bd2ba2f)などを参考)を用いて撮影するため、プラグインとして実装する必要があります。
実装したプラグインは[Continuous Shooting プラグイン](https://pluginstore.theta360.com/plugins/com.theta360.continuousshooting/)として提供しています。


解説のために、初版のソースコード一式を「サンプル」として以下に公開しておきます。
https://github.com/theta-skunkworks/theta-plugin-continuous-shooting-sample


今回はContinuous Shooting プラグインの実装を参考にプラグインでのバースト撮影の実装方法を説明します。

### パラメータ設定

まず、バースト撮影であることをCameraAPIで指定します。

``mParameters.set("RIC_SHOOTING_MODE", "RicStillCaptureStdBurst");``

撮影モードにバースト撮影であることを伝えます。
その他各種パラメータを設定します。(ソースは[こちら](https://github.com/theta-skunkworks/theta-plugin-continuous-shooting-sample/blob/master/app/src/main/java/com/theta360/continuousshooting/CameraFragment.java#L282))

バースト撮影で指定することができる撮影パラメータは以下です。

| パラメータ | 意味 |
|:------------|:------------|
| RIC_AEC_BURST_CAPTURE_NUM | 何枚撮影するか |
| RIC_AEC_BURST_BRACKET_STEP | ブラケット撮影時のEV間隔の指定 |
| RIC_AEC_BURST_COMPENSATION | 露出補正の値 |
| RIC_AEC_BURST_MAX_EXPOSURE_TIME | 露出時間の上限 |
| RIC_AEC_BURST_ENABLE_ISO_CONTROL | ISO感度コントロールを有効にするか |

また、それぞれの値にはデフォルト値があるので、設定しなくても撮影可能です。

### 撮影

撮影はこれをたたくだけ。

``mCamera.takePicture(onShutterCallback, null, onJpegPictureCallback);``

これまでのカメラAPIの使用方法と変わりませんね。



### ファイル保存

CameraAPIを使用して撮影すると、撮影結果はCallbackで受信し、ファイル保存の処理を自前で実装する必要があります。
撮影時に指定した、onJpegPictureCallbackのインスタンスに対してCallbackされます。(ソースは[こちら](https://github.com/theta-skunkworks/theta-plugin-continuous-shooting-sample/blob/master/app/src/main/java/com/theta360/continuousshooting/CameraFragment.java#L122))

ファイル保存はこれまでのやり方と変わりません。今回変わるのは、撮影された枚数分Callbackされるということです。
Continuous Shooting プラグインでは、Callbackを受け取ったときに指定した撮影枚数分Callbackが呼ばれていることを確認しています。
撮影が完了したことの管理が必要な場合は、正しく撮影回数分Callbackがきていることを確認してください。


## おわりに
いかがでしたでしょうか。
この記事を参考にして皆さんもバースト機能を使ったプラグインを開発いただけると嬉しいです。
単純な連写だけでなく高速ブラケット撮影ができますので、独自のHDRIプラグインを作成することに役立ちます。ぜひトライを！

参考までに、Continuous Shootingプラグインで撮影した時の9コマを使ってアニメGIFを作成してみました。
![JUMP.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263023/560684fd-7d10-ca69-2b9c-498fe00cccb6.gif)



## RICOH THETAプラグインパートナープログラムについて

THETAプラグインをご存じない方は[こちら](https://api.ricoh/products/theta-plugin/)をご覧ください。
パートナープログラムへの登録方法は[こちら](https://qiita.com/mShiiina/items/55d98f366e650ca42251)にもまとめてあります。
Qiitaの[RICOH THETAプラグイン開発者コミュニティ TOPページ「About」](https://qiita.com/organizations/theta-plugin)に便利な記事リンク集もあります。
興味を持たれた方は[Twitter](https://twitter.com/thetaplugin)のフォローと[THETAプラグイン開発者コミュニティ(Slack)](https://join.slack.com/t/thetadeveloper/shared_invite/enQtNzcxODI2MTk2ODg0LWY5YmU2ZTIxNGYwNzlmNWZjMWMyMWFlMzY3ZmQ3NGU3ZjZiZjI0Njk4MGIxMDU5NDJiMzQ4Y2FkNDEzYmFlNGU)への参加もよろしくおねがいします｡