iOS
Unity
AR
Swift
ARKit

ARKitにおけるカメラの解像度とフレームレート

ARKitにおける動画キャプチャフォーマットのコンフィギュレーション

ARKit 1.5というと、「ついに垂直平面も認識できるようになった!」という新機能が目立ちがちでしたが、もともとARKitが平面推定に用いている特徴点群へアクセスするAPIはあったので、ARKit 1.0の頃から垂直平面を推定することは可能ではありました。

しかしサードパーティ開発者がどうやっても乗り越えられなかった壁が、「解像度・フレームレートの変更」です。1.0時点ではこれらを変えるAPIは用意されておらず、AV Foundationのカメラ入力とARKitとを併用することもできませんでした。とくにキャプチャされるフレーム画像の解像度は1280 x 720と低く、iPhone 7(4.7インチ)や7 Plus(5.5インチ)のスクリーンで見ると普通に少しボケてましたし、ARFrameから取得したフレームごとの画像データを保存してアレコレしようとしてもコンテンツとしては解像度が物足りないということもありました。

ARConfiguration.VideoFormat

そこにARKit 1.5/iOS 11.3で追加されたのがARConfiguration.VideoFormatというクラスです。var framesPerSecond: Int(フレームレート)とvar imageResolution: CGSize(画像解像度)という2つのプロパティを持つシンプルなクラスです。

ARConfigurationプロトコルにvideoFormatというARConfiguration.VideoFormat型のプロパティが用意されており、ここに使用したい動画フォーマットをセットすることができます。

var videoFormat: ARConfiguration.VideoFormat { get set }

https://developer.apple.com/documentation/arkit/arconfiguration/videoformat

supportedVideoFormats

ただし、ARConfiguration.VideoFormatのフォーマットを適当につくってセットできるわけではありません。使用可能なフォーマットは以下の条件で変わってきます。

  • ARConfigurationの種類
  • デバイスの種類
  • iOSバージョン

Different devices and iOS versions offer different sets of supported video formats

https://developer.apple.com/documentation/arkit/arconfiguration/2942261-supportedvideoformats

使用可能なフォーマットの一覧は、次のクラスプロパティで取得できます。

class var supportedVideoFormats: [ARConfiguration.VideoFormat] { get }

このプロパティには、ARConfigurationという抽象クラスからアクセスすることはできません。ARConfiguration.supportedVideoFormatsとすると、実行時に次のようなエラーになります。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Supported video formats should be called on individual configuration class.'

ARWorldTrackingConfigurationのような、具象クラスからアクセスします。

print(ARWorldTrackingConfiguration.supportedVideoFormats)

ARセッションの動画キャプチャフォーマットを変更するには、supportedVideoFormatsから得られる配列に入っているフォーマットのうちひとつを選び、ARコンフィギュレーションオブジェクトのvideoFormatにセットします。

configuration.videoFormat = selectedVideoFormat

iPhone Xで利用可能なフォーマット一覧

現時点(iOS 12.0)で利用可能な5つのコンフィギュレーションクラスについて、iPhone X/iOS 12.0で出力したsupportedVideoFormatsを表にしてみました。

Configuration Resolution fps
ARWorldTrackingConfiguration (1920.0, 1440.0) 60
(1920.0, 1080.0) 60
(1280.0, 720.0) 60
AROrientationTrackingConfiguration (1920.0, 1440.0) 60
(1920.0, 1080.0) 60
(1280.0, 720.0) 60
ARImageTrackingConfiguration (1920.0, 1440.0) 60
(1920.0, 1080.0) 60
(1280.0, 720.0) 60
ARObjectScanningConfiguration (1920.0, 1440.0) 60
(1920.0, 1080.0) 60
(1280.0, 720.0) 60
ARFaceTrackingConfiguration (1280.0, 720.0) 60
(1280.0, 720.0) 30

フロントカメラを使うARFaceTrackingConfiguration以外、つまりリアカメラを使うコンフィギュレーションはどれも動画フォーマットの選択肢は同じ、という結果になりました。フレームレートはいずれも60 fpsで、実質変更できないようです。

ARFaceTrackingConfigurationについては、解像度は1パターン、fpsが2種類、という結果になりました。

iPhone 7 Plusで利用可能なフォーマット一覧

コンフィギュレーションタイプ以外に、デバイス、iOSバージョンによっても利用可能なフォーマットは変わるとのことで、手元のiPhone 7 Plus/iOS 11.4.1でも試してみました。

Configuration Resolution fps
ARWorldTrackingConfiguration (1920.0, 1080.0) 60
(1280.0, 720.0) 60
AROrientationTrackingConfiguration (1920.0, 1080.0) 60
(1280.0, 720.0) 60
ARImageTrackingConfiguration 1 - -
ARObjectScanningConfiguration 1 - -
ARFaceTrackingConfiguration 2 - -

実行前の予想は「実は変わらないんじゃないの」と思ってましたが、変わりました。解像度(1920.0, 1440.0)のフォーマットは利用できないようです。デバイスがiPhone Xだと利用できるのか、iOSバージョンが12以上だと利用できるのかは、手元にiPhone X/iOS 11またはiPhone 7/iOS 12がないのでわかりません。。

どう使い分けるのか?

supportedVideoFormatで得られるARConfiguration.VideoFormatの配列は、品質の高い順に並んでいます。

the order of this array always puts higher-quality formats before lower-quality formats.

そしてデフォルトでは、配列の先頭にある動画キャプチャフォーマットがコンフィギュレーションにセットされています。つまり、デフォルトではもっとも高品質なフォーマットが使われているわけです。

By default, the videoFormat property for a new session configuration matches the first video capture format in this array.

つまり本APIの(現在の設定をgetする以外の)用途としては、あえて低い解像度や低いフレームレートにしたいケース、ということになります。UIやキャプチャした動画データのPre/Post処理でGPU負荷の高い処理をしたい場合等に必要になってくるかもしれません。


  1. iOS 11.xなので利用不可 

  2. iPhone 7 Plusなので利用不可