一覧に戻る

iOS ネイティブAPIのカメラ制御

2017.09.22iOSネイティブAPI

カメラの設定

ここではWikitude SDKで可能になるカメラ設定の概要を紹介します。

カメラの位置

カメラの位置は、前面、背面、またはデフォルトのカメラを起動するかどうかを定義します。これは、WTNativeStartupConfiguration.captureDevicePositionまたはWTCaptureDeviceManager.activeCaptureDevicePositionを使用して設定できます。

カメラのフォーカスモード

カメラのフォーカスモードは、カメラが内部的に使用するフォーカスモードを定義します。WTNativeStartupConfiguration.captureDeviceFocusModeまたはWTCaptureDeviceManager.focusModeを使用して設定できます。カメラのフォーカスモードは、次のモードのいずれかになります。

  • Continuous: デバイスがサポートしている場合はデフォルトですが、このモードでは、カメラは必要に応じて自動的に再フォーカスしようとします。
  • Once: 現在のビューでカメラを再フォーカスさせることができます。フォーカスを変更する必要がある場合は、この値を再度設定できます。ONCEの値が設定されるたびに、カメラは現在のシーンに再びフォーカスします。
  • OFF: オートフォーカスを無効にし、特定のマニュアルフォーカス距離にフォーカスを設定します。

手動のカメラフォーカス

WTNativeStartupConfiguration.captureDeviceFocusDistanceまたはWTCaptureDeviceManager.focusDistanceを使用して設定できます。

解像度

WTNativeStartupConfiguration.captureDeviceResolutionを使用して設定でき、実行時に変更することはできません。 推奨値は次のとおりです。

推奨 Geo Image Tracking Extended Tracking Cloud Recognition Instant Tracking
WTCaptureDeviceResolution AUTO AUTO SD_640x480 SD_640x480 SD_640x480

 

この設定はarmv8デバイスでのみ使用され、他のすべてのアーキテクチャはデフォルトでSD_640x480になります。

フレームレート

カメラのフレームレートは30または60fpsに設定できます。60fpsを選択すると、カメラ解像度は60fpsへの変更が可能になります。

サポートされている最初の組み合わせは、SDKで使用されます。

  • FullHD 60 fps
  • HD 60 fps
  • SD 60 fps
  • FullHD 30 fps
  • HD 30 fps
  • SD 30 fps

WTNativeStartupConfiguration.targetFrameRateを使用して設定できます。

ズーム

デジタルズームは、WTCaptureDeviceManager.zoomLevelを使用して制御できます。 最大ズームレベルを取得するには、WTCaptureDeviceManager.maxZoomLevelを使用します。

フラッシュ

フラッシュは、WTCaptureDeviceManager.torchModeを使用してオンとオフを切り替えることができます。

カメラ制御

WTCaptureDeviceManagerは、アクティブなキャプチャセッションの間はキャプチャデバイス固有の設定を変更できます。

* the capture device position
* the capture device focus mode
* the capture device focus distance
* the capture device zoom level

WTCaptureDeviceManagerオブジェクトへの有効なポインタは、WTWikitudeNativeSDKの-captureDeviceManagerメソッドから取得できます。このポインタはSDKが実行されている場合にのみ有効であることに注意してください。SDKが停止している場合、キャプチャデバイスに対する変更は、-start:completion:の呼び出し時に引数としてstartupHandlerに渡したWTStartupConfigurationオブジェクトを使用して行われます。

以下のサンプルでは、UIPickerViewを使用して、ユーザーがカメラに固有の値を選択できるようにしています。このUIPickerViewは、メインストーリーボードのカメラシーンのビュー階層に追加されます。デフォルトでは、UIPickerViewはOpenGL ES 2.0 Viewの後ろに配置されるため、画面に表示されません。UIPickerViewを表示するには、ボタンがタッチされた場合に下側のOpenGL ES 2.0 View制約を変更してアニメーション表示し、UIPickerViewを出現させます。そのために、iOS標準のUIViewアニメーションが使用されます。詳しくはWTCameraControlsViewController -handleCameraControlsPresentationメソッドを参照してください。

UIPickerViewとWTCaptureDeviceManagerとの接続は、WTCameraControlsModelというカスタムクラスとそのデリゲートオブジェクト(このサンプルではWTCameraControlsViewController)によって行われます。このWTCameraControlsModelカスタムクラスはUIPickerViewデータソースとデリゲートプロトコルを実装しており、そのカスタムデリゲートオブジェクトを使用して現在のカメラ固有の値を取得したり、UIPickerViewから新しく選択された値を公開したりします。 WTCameraControlsModelはUIKitに関連する機能を扱うだけなので、このガイドではその実装の詳細は説明しません。以下のサンプルコードは、前述のオブジェクト接続を示します。以下のコードはすべてWTCameraControlsViewControllerクラスにあります。

self.cameraControlsPickerModel = [[WTCameraControlsModel alloc] init];
self.cameraControlsPickerModel.delegate = self;
self.cameraControlPicker.dataSource = _cameraControlsPickerModel;
self.cameraControlPicker.delegate = _cameraControlsPickerModel;

WTCameraControlsModelは有効なすべてのカメラ設定を内部で把握しており、それらの情報を使用してUIPickerViewをロードします。UIPickerViewがロードされてユーザーが異なる値を選択すると、WTCameraControlsModelのデリゲートを使用して値の変更が伝達されます。WTCameraControlsViewControllerはこのデリゲートプロトコルを実装しており、さらにWikitude SDK ネイティブAPIへの参照も保持しているため、このWTCameraControlsModelのデリゲートが呼び出されると、ビューコントローラーによって適切なキャプチャデバイスの値が設定されます。以下のサンプルコードは、キャプチャデバイスの位置に関するこの処理を示します。

- (void)cameraControlsModel:(WTCameraControlsModel *)cameraControlsModel didSelectCameraPosition:(AVCaptureDevicePosition)activeCameraPosition
{
    if ( [self.wikitudeSDK captureDeviceManager] ) {
        [[self.wikitudeSDK captureDeviceManager] setActiveCaptureDevicePosition:activeCameraPosition];
    }
}

[self.wikitudeSDK captureDeviceManager]の呼び出し時にnilチェックが行われていることに注意してください。このチェックを行う理由は、Pickerの値が変更されたときにWikitude SDK ネイティブAPIが一時停止している可能性があるためです。
Pickerが再び表示されるたびに、WTCameraControlsModelはそのデリゲートオブジェクトを通じて現在アクティブなキャプチャデバイス設定を確認します。以下のサンプルコードは、現在アクティブなキャプチャデバイスの位置に関する処理を示します。

- (AVCaptureDevicePosition)currentlyActiveCameraPositionForCameraControlsModel:(WTCameraControlsModel *)cameraControlsModel
{
    return [[self.wikitudeSDK captureDeviceManager] activeCaptureDevicePosition];
}