WWDC22:iOS 15.4以降で採用された進化したカメラキャプチャー
※本サイトは、アフィリエイト広告および広告による収益を得て運営しています。購入により売上の一部が本サイトに還元されることがあります。
Appleが、WWDC22において、カメラ機能に関する「Discover advancements in iOS camera capture: Depth, focus, and multitasking」を公開しています。
iPhone 12 Pro、iPhone 13 Pro、iPad Proは、高密度な深度マップを出力できるLiDAR Scannerを搭載しています。
LiDAR Scannerは、周囲に光を照射し、シーン内の表面で反射した光を集める仕組みになっています。
そして、その光がLiDARから周囲に照射され、反射してスキャナーに戻るまでの時間を計測することで、奥行きを推定するのです。
この一連のプロセスは、1秒間に数百万回行われます。
新しいLiDAR深度カメラAVCaptureDeviceを使用するアプリを実行しています。
このアプリは、ライブカメラのフィードの上にストリーミング深度データをレンダリングしています。
近くにある物体は青、遠くにある物体は赤で表示されます。そしてスライダーを使って、深度の不透明度を調整することができます。
このアプリは、高解像度の深度マップを使った写真も撮影します。写真を撮ると、同じ深度オーバーレイが適用され、さらに高解像度の静止画が撮影されます。
このアプリには、もうひとつ仕掛けがあり、トーチボタンを押すと、高解像度の深度マップとカラー画像を使って、RealityKitでスポットライトが描画されます。
スポットライトをタップして、いろいろなものに当てることができます。
iOS 15.4で新たに、あなたのアプリはAVFoundationでLiDAR Scannerにアクセスできるようになりました。
新しいAVCapture Device Typeとして、ビデオと深度を提供する内蔵LiDAR Depth Cameraを導入し高品質で高精度な深度情報を生成します。
この新しいAVCaptureDeviceは、背面広角カメラで映像を、LiDAR Scannerで奥行きを取得するもので、映像も深度も広角カメラの視野に収まるように撮影されます。
また、TrueDepth AVCaptureDeviceと同様に、すべてのフォーマットが深度データの配信に対応しています。
この新しいAVCaptureDeviceは、LiDAR Scannerからの疎な出力と背面広角カメラからのカラー画像を融合して、高品質の深度データを生成します。
LiDARとカラーの入力は、機械学習モデルを用いて処理され、高密度な深度マップが出力されます。
LiDAR Depth Cameraは背面広角カメラを使用するため、AVCaptureMultiCamSessionを使用して望遠カメラと超広角カメラを追加で使用することができます。これは、複数のカメラを同時に使用したいアプリに便利です。
LiDAR Depth Cameraは、640×480のビデオ解像度から4032×3024の12メガピクセルのフル画像まで、様々なフォーマットを公開します。
ストリーミング中は、最大320×240の深度マップを出力することができ、写真撮影では、768×576の深度マップを受け取ることができます。
なお、ビデオのアスペクト比に合わせるため、16×9フォーマットと4×3フォーマットでは、深度解像度が若干異なります。
LiDAR Depth Camera AVCaptureDeviceは、iPhone 12 Pro、iPhone 13 Pro、iPad Pro 第5世代で利用できます。
また、iPhone 13 Proでは、背面カメラの組み合わせで深度データを配信することができます。
AVFoundation Capture APIでは、これらを物理デバイスで構成される「仮想デバイス」と呼んでいます。iPhone 13 Proの背面には、4つの仮想AVCaptureDevicesが用意されており、使用することができます。
新しいLiDAR Depth Cameraは、LiDAR Scannerを広角カメラで使用します。
ワイドカメラとテレフォトカメラを使用する「デュアルカメラ」、ワイドカメラとウルトラワイドカメラを使用する「デュアルワイドカメラ」、そして、ワイドカメラ、ウルトラワイドカメラ、テレフォトカメラを使用する「トリプルカメラ」です。
これらのデバイスは、生成される深度の種類に違いがあり、LiDAR Depth Cameraは、"絶対深度 "を計測するカメラです。
飛行時間法を用いているため、実世界の縮尺を算出することができます。
例えば、計測のようなコンピュータビジョンのタスクに最適です。TrueDepth、Dual、Dual Wide、Tripleの各カメラは、視差に基づく相対的な深度を生成します。
これは消費電力が少なく、写真効果をレンダリングするアプリに最適です。
AVCaptureDepthDataOutput から深度をストリーミングしたり、AVCapturePhotoOutput から写真に添付された深度を受信することができます。
深度データはデフォルトでフィルタリングされていて、フィルタリングは、ノイズを減らし、深度マップの欠落した値(穴)を埋めます。
これは、ビデオや写真のアプリに最適で、深度マップを使用してカラー画像に効果を適用するときにアーティファクトが表示されないようにします。
しかし、コンピュータビジョンのアプリは、深度マップの元の値を保持するために、フィルタリングされていない深度データを好むはずです。
フィルタリングを無効にすると、LiDAR深度カメラは信頼度の低いポイントを除外します。
深度データのフィルタリングを無効にするには、AVCaptureDepthDataOutputのisFilteringEnabledプロパティをfalseに設定し、デリゲートコールバックからAVDepthDataオブジェクトを受信すると、フィルタリングが行われなくなります。
オートフォーカスシステムと自動露出システムは、シーンを解析して最適な画像を撮影するシステムです。
オートフォーカスシステムは、被写体にピントが合うようにレンズを調整し、自動露出システムは、被写体が見えるようにシーンの最も明るい部分と最も暗い部分をバランスよく調整します。
しかし、自動調整では被写体の顔にピントが合わないことがあります。また、明るい逆光のシーンで被写体の顔が見えにくくなることもあります。
デジタル一眼レフカメラなどのプロ向けカメラでは、シーン内の顔を追跡して、ピントと露出をダイナミックに調整し、顔が見えるようにするのが一般的な機能です。
iOS 15.4では新たに、フォーカスや露出のシステムが、顔を優先的に表示するようになりました。私たちはこのメリットをとても気に入ったので、iOS 15.4以降でリンクされたすべてのアプリケーションで、デフォルトでこの機能を有効にしました。
右は顔検出オートフォーカスを有効にした状態で、ヒゲの細かい部分まで確認できます。逆光の明るいシーンでは、顔の露出を適正に保つことが難しい場合があります。しかし、顔優先の自動露出により、顔が見やすくなっています。
並べてみると、ここでも違いがわかります。右の写真では、彼の顔がしっかり露出されていることで、背景の木々が明るく写っていることに注目してください。そして、空も明るくなります。
顔を優先することで、シーン全体の露出が調整されるのです。
iOS 15.4では、AVCaptureDeviceの新しいプロパティで、顔検出オートフォーカスと自動露出を有効にするタイミングを制御できます。
デバイスがこれらの設定を「自動調整」するかどうかを制御し、有効にするタイミングを決めることができます。
この動作の自動有効化は、写真アプリに最適で、Appleのカメラアプリで使用されています。
また、ビデオ会議アプリにとっても、通話中に顔が見えるようにしておくことは素晴らしいこで、FaceTimeはこれを利用していますが、自動焦点や自動露出のシステムが顔によって駆動されるのは、アプリにとって最適でない場合もあります。
たとえば、撮影した画像をユーザーが手動でコントロールできるようにしたい場合は、この機能をオフにすることを検討します。
高度なストリーミング設定を使って、アプリのニーズに合わせたオーディオとビデオデータを受信する方法について説明します。
AVFoundation Capture APIにより、開発者はカメラを使って没入型アプリを構築することができます。
AVCaptureSession は、AVCaptureOutputs に接続されたカメラやマイクなどの入力からのデータフローを管理し、ビデオ、オーディオ、写真などを配信することができます。
一般的なカメラアプリのユースケースを例にとって説明すると、録画したビデオにフィルタやオーバーレイなどのカスタムエフェクトを適用するといったアプリには、次のようなものがあります。
AVCaptureSession には、カメラとマイクの 2 つの入力があり、ビデオ データとオーディオ データの 2 つの出力に接続されています。
ビデオデータは、エフェクトが適用され、処理されたビデオは、ビデオプレビューと記録用のAVAssetWriterの2箇所に送られます。
iOS 16とiPadOS 16の新機能として、アプリは複数のAVCaptureVideoDataOutputsを同時に使用することができます。
それぞれのビデオデータ出力について、解像度、手ぶれ補正、向き、ピクセル形式をカスタマイズできます。
1つの出力は、プレビュー用に小さいバッファを提供し、もう1つは録画用にフルサイズの4Kバッファを提供することができます。
また、アプリは、より小さなプレビューバッファで、よりシンプルでパフォーマンスの高いバージョンのエフェクトをレンダリングし、高画質を確保することができます。
iOS 16 および iPadOS 16 からは、複数のビデオデータ出力を使用することに加えて、アプリは AVCaptureVideoDataOutput および AVCaptureAudioDataOutput からデータを受信しながら AVCaptureMovieFileOutput で録画することができるようになります。
セッションに追加できる出力は、セッションのhardwareCostプロパティに問い合わせることで、システムが自分の構成に対応できるかどうかを確認することができます。
映像データをムービーファイル出力で受け取ることで、録画しながら映像を確認し、シーンを分析することができます。
また、音声データをムービーファイル出力で受け取ることで、音声をサンプリングしながら収録することができ、収録内容を聞くことができます。
このようにキャプチャグラフを使えば、AVCaptureMovieFileOutputに録画の仕組みをオフロードしつつ、非圧縮のビデオとオーディオのサンプルを受け取ることができます。
iOS 16から、AVCaptureSessionsはマルチタスク中にカメラを使うことができるようになります。
以前は、マルチタスク中にカメラシステムが提供できるサービスの品質が懸念されたため、マルチタスク中のカメラアクセスを防止していました。
ゲームなどのリソースを大量に消費するアプリとカメラを使用するアプリを同時に実行すると、コマ落ちやその他の遅延が発生し、カメラフィードの品質が低下する可能性があります。
数カ月後、数年後に画質の悪いビデオを見たユーザーは、マルチタスク中に録画したことを思い出さないかもしれません。
良いカメラ体験を提供することは、私たちの最優先事項です。マルチタスク中にカメラの映像を録画したことをシステムが検知すると、低画質になる可能性があることをユーザーに知らせるダイアログが表示されます。
ビデオ通話やビデオ会議のアプリケーションでは、システムが提供するPicture in Pictureウィンドウに遠隔地の参加者を表示することができます。
これにより、アプリのユーザーは、iPad でマルチタスク中にビデオ通話をシームレスに継続できるようになります。
AVKit は、リモート通話参加者を表示するためのビューコントローラをアプリに指定するための API を iOS 15 で導入しました。
ビデオ通話ビューコントローラは、ウィンドウのコンテンツをカスタマイズすることができます。