ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
カメラキャプチャとフォトセグメンテーションの最新情報
AVCapture APIの強力な新機能を使用すると、複数のカメラから同時に写真やビデオをキャプチャできます。写真では、写真の中の髪、肌、歯を分離できるセマンティックセグメンテーションが利用できるようになりました。このセッションでは、こうした向上点によって優れたカメラAppを作成し、目を見張るような写真効果を簡単に生み出す方法を紹介します。
リソース
関連ビデオ
WWDC19
WWDC17
-
ダウンロード
(音楽)
こんにちは (拍手) セッション225へようこそ カメラソフトウェアチームの ブラッド・フォードです 長い一日でしたが これが最後になります 残っていただき感謝します 5時からのセッションの中でも これはお勧めです
iOSカメラスタックの 2つの追加機能について 前半約40分 マルチカメラキャプチャの話をして― ジェイコブと デイヴィッドが― セマンティックセグメンテーションの 話をします では1つ目 マルチカメラキャプチャ またの名を マルチカム
サードパーティからの要望が 最も多く その需要は 年々 増えています そこで今回は 同時キャプチャについて話します 動画や音声 メタデータ 深度などを 複数のカメラとマイクで 同時に記録する機能です
サードパーティだけではなく ファーストパーティからも― マルチカムの要望が ありました 最も人気が高いのは ARKitです Keynoteでも発表された 新しいARKit 3では 顔とポーズの追跡に フロントカメラを使います バックカメラの ワールドトラッキングは 仮想キャラクターの配置を 視覚的に補助する機能です
私たちはAVFoundationの 開発当初からMacのマルチカムを サポートしています しかしiOSでは いまだに複数のカメラを 同時に使えません それには正当な理由があるのです 1つはハードウェアの制限で カメラは母線を共有しています 2つのカメラを同時に稼働するには 完全にパワー不足です 2つ目の理由は 信頼できるAPIにするためです 複数のカメラを同時に使っても 電話機本体がダメージを受けないように しなければなりません 温度と帯域幅の制限をクリアし ハードウェアを現実的にする 必要がありました そしてついにiOS 13と 最新のハードウェアで マルチカムをサポートします iPhone XSと iPhone XS Max iPhone XRと 新しいiPad Pro すべてにおいて ハードウェアの制限を解決しました
新しいAPI一式で マルチカムのセッションを 構築してみましょう
AVFoundationには 4つの主要なグループがあります 入力と出力 そして セッションと接続です
AVCaptureSessionが データを整理し 開始と停止の指示を受けます
それに1つ以上の入力を 追加します AVCaptureDeviceInputは カメラやマイクのための ラッパーです
データを受け取るために 1つ以上の出力も 追加する必要があります するとセッションが 互換性のある入力と出力を 自動的に接続します この従来のAVCaptureSessionでは 各セッションの許容は 1つのカメラだけです
iOS 13で導入した AVCaptureSessionの派生― AVCaptureMultiCamSessionでは 複数の入出力が可能になりました
AVCaptureSessionが 劣るわけではありません 1つのカメラによるキャプチャの場合は むしろ勝っています MultiCamSessionには いくつかの制限があるからです その話は後ほど
ではAVCaptureMultiCamSessionの 通常の使い方をお伝えします MultiCamSessionに 前面と背面のカメラを デバイスとして加えます 各カメラのフレームを同時に受け取る データ出力も可能です リアルタイムプレビューを使うなら 前面と背面の各カメラに VideoPreviewLayerを加えます もっと加えていきましょう
メタデータの同時出力や 同時バーコードスキャン 同時顔認識 各カメラに記録するために 複数の動画ファイル出力もできます 複数のリアルタイムキャプチャのために 複数の写真出力も追加可能です 入力から出力への矢印が増え グラフが複雑になってきました
この矢印が AVCaptureConnectionで 入力から出力への流れを 決定します 接続構造の説明をするので デバイス入力の話を
キャプチャ入力の AVCapture入力ポートは コンセントのようなものです 各メディアタイプに 1つずつ作成され 何かをつなげばデータが流れます コンセントから流れる 電力と同じです この入力には どのポートを使えるのか プロパティを開くと― 入力ポートのアレイが表示されます デュアルカメラにあるのは 4つのポート 動画 深度 バーコードスキャンと顔認識に使う メタデータ 動画の出力と接続する メタデータです
AVCaptureSessionの 出入力の追加方式で 入力と出力を加えると このような結果に セッションが一致する メディアタイプを検出します このVideoDataOutputが 動画を受け取ります 動画を作成するコンセントと 自動的に接続されました AVCaptureSessionには 皆さん 慣れ親しんでるでしょう MultiCamSessionは別物です なぜなら複数の入力と 複数の出力になるからです 間違うことなく確実に 正しい入力と出力同士が― 接続される必要があります MultiCamSessionを作成する時は 自動接続をお勧めしません 代わりに 専用の特別なアダーを使い 接続をせずに 入力または出力を加えるのです 動画のプレビューレイヤにも―
使うことができます setSessionWithNoConnectionsは セッションに こう指示します “これらの入力と出力があるけど 放っておいてくれ” “後で好きに手動で接続するから” AVCaptureConnectionを 自分で作るのです 接続したいポートと出力を 自分で選び セッションに接続の追加を 指示します
実演したほうが分かりやすい ここから先は仲間のニック・ゲロが AVMultiCamPiPの実演を ニック
ありがとう AVMultiCamPiPは同時再生用の アプリケーションです 前面と背面カメラのプレビューが 表示されます 全画面表示したいほうの カメラを― ダブルタップします
(拍手)
ブラッドが アップル・パークにいます 彼に質問をする前に 後で見られるように 記録ボタンを押します ブラッド アップル・パークはどう? ニック ここは地獄だよ 池の前で いろいろ起こってるんだ 水の音がすごくて 今にもずぶ濡れになりそうだし 野生の動物の鳴き声も聞こえる 正直なところ 怖いよ 恐ろしいね 気をつけて ありがとう じゃあ さっそく記録したものを 見てみましょう
これが動画です アプリケーションで表示させたように 2つのカメラの 切り替えができます これがAVMultiCamPiPです (拍手) ありがとう ニック
AVMultiCamPiPの内部で 起きたことを説明します 前面と背面のカメラ 2つのデバイス入力が 接続せずに追加されました ビデオデータ出力と VideoPreviewLayerも2つ 画面に映すには VideoPreviewLayerに― 片方を大きく表示するように 指示を与えます ダブルタップすると 画面の配置が換わり Zオーダーが逆になります Metal Shader Compositorのコードを 見てください この2つのVideoDataOutputを 合成すると 小さいPiPが 1つのフレーム内に並びます すると合成されたバッファが AVAssetWriterに送信され 1つのビデオトラックに記録を このセッションに関連するコードで マルチカムのキャプチャを 作成できます
制限について話しましょう AVMultiCamSessionは パワーツールですが できないことも あります
第一に 1つのカメラを 2つとは偽れません AVCaptureDeviceInputは 複数のインスタンスを作れます バックカメラで 10個 作ることもできます しかし それをすべて MultiCamSessionに加えるのは無理です 例外が発生します 1つのカメラにつき 入力は1つです 同じタイプの出力を 2つにすることもできません 1つのシグナルを 2つのデータ出力に分けられないのです 複数のカメラのVideoDataOutputへの 接続は可能ですが 出力の分散はできません
その反対の場合も同じことが言えます iOSではメディアをミックスできません 1つの出力には1つの入力だけです 2つのカメラのソースを 詰め込むこともできません 動画のミックスの仕方が 分からないのです 別々のデータ出力のバッファを 独自のコードで合成はできます Metal Shader Compositorと 同じ要領です しかしセッションの構築においては 1つの出力には 1つのカメラのみです
次はプリセットについて 従来のAVCaptureSessionにおける プリセットの意図とは 共通するサービス品質を検出し すべての入出力に適用することです sessionPresetを “high”に設定すると― デバイスの解像度やフレームレート 出力が設定され 高品質な動画になります 1080p30のように
プリセットは MultiCamSessionの問題です このグラフで分かるように―
MultiCamSessionの配列は混成です 全体を高品質にする必要がなく デバイスごとに品質を 変えたい場合もあります 例えばフロントカメラは 640×480の 低解像度のプレビュー それと同時にバックカメラを 1080p60の高品質にしたいとします これに対応できるプリセットは ありません そこでMultiCamSessionでは 1つのプリセットだけを サポートします 入力を優先するのです つまり入力と出力を 独立したままにして 自身でactiveFormatを設定します
次はコストの作用について マルチカムに時間をかけたのは 信頼できるAPIを目指したからです 複数のカメラと すべての機能を使う時に 負うコストを 計算できるようなAPIです
現実的な目標です “無料のものなどない” 私を父親だと思って 聞いてください 耳が痛い話です クレジットカードの機能 お金への責任や 身分相応の暮らし そのような内容です
iOSは帯域幅に制限があります 複数のカメラやセンサーが 付いていても― ISPは1つしかありません センサーから送られる すべてのピクセルが 1つのISPによって 処理されるのです クロックごとに処理できる ピクセル数には限界があります 同時に処理できるピクセル数は 限られているのです ハードウェアのコストは ビデオの解像度に左右されます 解像度が高いほど ピクセル数が多い ピクセルの処理速度を上げれば 処理するピクセル数も増えます
センサービニングを ご存じでしょうか?
隣り合ったピクセルの情報を結合し 帯域幅を減らす方法です ここにある画像に 2×2ビニングをします 4ピクセルを1つに結合していくので 4分の1に縮小されるのです ノイズも削減され 帯域幅も減り― ピクセルごとの強度は 4倍になります 多くの利点がありますが 欠点は画像の質が 少し落ちることです 斜線に少し段が生じます しかし超低出力は その欠点を補って余りある利点です ARKitでカメラを使う時は常に この方法が用いられます ARのために パワーを節約するのです コストの報告の仕方について 話しましょう MultiCamSessionが コストを計算し 設定を変えるたびに記録します スーパーの買い物や オンラインストアで カートに商品を入れる要領です 予算の限界に近づいたら 商品をカートから 自由に出し入れできます MultiCamSessionも コストを把握できます HardwareCostは 新しいプロパティです 新セッションの作成時は ゼロですが 機能や出入力を追加すると 増加していきます 1.0未満のうちは大丈夫 問題なく作動します 1.0以上になったら要注意です ISPの帯域幅の制限は厳しく 他のフレームも処理できなくなります すべてできるか 何もできないかです 1.0を超えて稼働すると AVCaptureMultiCamSessionが 拒否します ランタイムエラーを表示し ハードウェアへの過重負担だと 指摘します
コストを削減するには? 最も確実な方法は 低解像度を選ぶこと 解像度を変えたくなければ ビニング方式を選んでください 質は落ちるが パワーは節約できます
フレームレートを下げるのは 効果的か? いいえ 理由はiOS 4から AVCaptureDeviceが フレームレートの変更を 可能にしたからです 例えば120fpsの場合 60fpsに設定し直したとしても― コストは120fpsの時と同じです なぜなら120fpsまで上げた時のことを 考慮しているからです しかし今はAVCaptureDeviceInputに オーバーライドのプロパティがあります それを設定すると 高フレームレートを― 低いレートに変更可能です フレームレートの上限が 決められるのです
これはAPIの混乱する点ですが フレームレートを 時間として捉えます 1を時間で割った数を 設定するのは同じです 60fpsを30fpsに変更するには 30分の1でCMTimeを作成します そしてdeviceInputを “videoMinFrameDurationOverride = thirtyFPS”と設定 これで60fpsから 30fpsに変更され 30fpsのコストになります
AVMultiCamPiPの すばらしい機能にも言及しましょう 反復的にコストを削減できます 最も重要なものを選ぶ再帰関数で 重要度の低いものを抑制し コスト削減を図るのです システムの負担は 2番目に大きなコストの要因です 電話機は 熱しやすい 小さな箱に包まれた 極めて高出力のコンピュータです iOS 11では Camera System Pressure Statesで カメラの状況を確認できます カメラシステムの負担は OS全体の熱によるものです
バッテリーが瞬時給電をします 充電は どれくらいか? 自分がすることに必要なだけ 電圧を上げることができるのか? そして赤外線プロジェクタの温度 TrueDepthカメラのあるデバイスには 赤外線やRGBのカメラもあり 熱を発するので システムの負担になります
“軽少”から“停止”まで 5段階あり “軽少”であれば調子がよく 何でも実行できます “適正”でも ほぼ問題はありません “深刻”になると システムが抑制し始めます GPUのサイクル数が減り 質が低下するということです “重大”では多くが抑制され “停止”になると ハードウェアの破損を防ぐために カメラも稼働不可に システムの負担が 原因だと表示され セッションが自動的に停止します カメラを再び使えるのは “軽少”に戻ってからです
これはiOS 11の話です iOS 13では前もって システムの負担を把握できます 現在の状況を示すだけでは 起動前に遊んだ ゲームが影響することもあります システムの負担に関しては カメラの独立したコストを 知ることができます そのコストの要因は ハードウェアや他のものと同じです ビデオ手ぶれ補正や 光学式手ぶれ補正などの 電力コスト スマートHDRもそうです これらはすべてシステム全体の 負担になります
MultiCamSessionが 前もって計算する場合― すでにある情報だけを根拠にします GPUの処理を同時に行っても カメラ以外のことは スコアに含まれません
使い方を話しましょう systemPressureCostは 作動できる時間を示してくれます システムが静止しておらず 1.0未満なら無限に使えます よく管理された状態です 1.0~2.0だと 15分までは問題ありません 2.0~3.0は10分まで 3.0を超えると かなり短くなります 3.0を超過しても カメラは使えますが すぐに問題が起きるでしょう 強制終了が行われる場合 セッションは中断 ハードウェアを守るためです システムの負担が 極めて高コストでも 30秒以内に作業を 終えるのであれば構いません
稼働中に負担を軽減するには? セッションの設定中ではなく 稼働し始めて 負担の増加に気づいた時です フレームレートを下げると すぐに負担が減ります もう1つはGPUやCPUの処理を 抑える方法です 最後の手段として カメラを停止することが 挙げられます AVMultiCamSessionには すばらしい機能があります 他のカメラに 影響を及ぼすことなく 1つのカメラを 停止できる機能です 前面と背面のカメラを稼働中 過重負担に気づいたとしましょう 片方を停止しても もう1つのカメラの 機能は損なわれません 止めたいカメラの 入力ポートを停止するには 入力ポートの対応プロパティを “false”に設定します するとストリーミングが停止し かなりの電力の節約になります
ハードウェアとシステムの負担 2つのコストについて話しました 別のコストもあります ないとウソをつく気はありません 例えばメモリがあります iOS 13では稼働できるデバイスの 組み合わせを制限しました 確実にトラブルを避けるのが 目的です
組み合わせの数は 限られています これはiPhone XSのリストです 後でじっくり見てみてください 6つの構成をサポートしており 同時に稼働できるカメラは2つです 構成1のチェックが 1つだけの理由が気になりますか? デュアルカメラは ソフトウェアカメラで 広角と望遠レンズがある 2つのカメラだからです
マルチカムがサポートされているか 知るには? MultiCamSessionで 複数のカメラを稼働できるか確認を isMultiCamSupportedという クラスで すぐに分かります 同時に稼働できるデバイスを 知るには? AVCaptureDevice.DiscoverySessionを 作成し supportedMultiCamDeviceSetsで 確認を どのデバイスを同時に使えるか 知ることができます 次に私たちが人為的に 制限を設けた― フォーマットについて iPhone XSのバックカメラは 40以上のフォーマットが サポートされています MultiCamSessionで ビデオフォーマットを制限したのは デバイスで快適に 同時に使えるからです グループに注目してください 1つ目のグループは 低出力のビニングです 2×2ビニングにより 低出力を実現できます 60fpsまで使えて 640×480から1920×1440まで 選択肢があります
次のグループは 30fpsの1920×1080 非ビニングのフォーマットで 従来のセッションの high presetと同じです マルチカムに使えます 最後は非ビニングの 30fps 1920×1440で 写真にも使えるフォーマットです 12メガピクセルのサポートは していません 本体に悪影響を及ぼします しかし30fps 1920×1440の フォーマットで― 12メガピクセルの 高解像度の写真は撮れます 複数のカメラを使用して 同時撮影する時に代用できます
マルチカムを サポートしているか知るには? フォーマットを通した処理中に 確認することが可能です デバイスのフォーマットを 通して処理し 解像度が次に低く マルチカムをサポートするのです それをフォーマットに設定
最後の方法を紹介します コストを報告するためには MultiCamSessionを使います よってアプリケーションでの 複数のセッションは サポートしていません 複数のカメラを 同時に使う場合も同様です 同時に稼働はできますが iOSでのサポートは― 1度に1つのセッションのみ
以上が父親からの話でした いいコードを書き 11時までには帰宅すること 以上 楽しい話に戻ります 同時ストリーミング
ソフトウェアカメラは iPhone 7 Plusで発表した デュアルカメラです 現在はXSとXS Maxにも 搭載されています TrueDepthカメラも 赤外線とRGBカメラから成るので 同じです 2つのカメラの差異から 深度を測れます 今まで それらに 名前がなかったのですが iOS 13では バーチャルカメラと命名 デュアルカメラもその1つで ズーム比に基づき ビデオストリームが入れ替わります 2倍に近づくと 広角から望遠レンズに替わるのです 2つの画像の間に 生まれる差異により 深度の調整もできます しかし一度に得られる ストリームは1つです
名前を付けて APIにプロパティもあるので そのデバイスがプログラムにより バーチャルデバイスなのか分かります では物理デバイスは何なのか? APIでは constituentDevicesと呼びます
同時ストリーミングは バーチャルデバイスのそれらを 同時に稼働させるのです 広角と望遠からの同時ビデオを ストリームできるのは初めてです
バーチャルデバイス上で 設定をします
いくつかルールがあります バーチャルデバイスと constituentDevicesを 別々に考えてはいけません 解像度やフレームレートも同じで ハードウェアレベルで 一致しています つまりセンサーが それらのフレームを 同じ方法で 読み取っているのです だから読み出しのミドルラインは まったく同じ時刻です フレームセンターも一致します 露出やホワイトバランス フォーカスも同じなので ほぼ同じカメラのようなものです 視界だけが異なります
分かりやすいように 実演を行います これはAVDualCamです
よし
2つの同期化されたカメラを 読み込むことで― バーチャルカメラの映像を 表示します
異なる見え方で表示できます これは― 広角と望遠カメラの ストリームで構成されています 左が広角で右が望遠カメラです 証明するために 片方のレンズに指を
反対も 別々のカメラです (拍手) 広角で拡大しているので 望遠と同じ見え方です 完全に一致しているのが 分かります おかしな部分は何もありません 露出とフォーカスは 同時に変わります 次に Side by Side Viewから Split Viewに― 切り替えてみましょう 少し見にくいですね 左に見えるのが広角カメラで 右が望遠カメラ 各フレーム半分ずつです トリプルタップすると Distance-o-meterが現れ 2つのイメージの深度の 度合いを変えられます 2つのイメージを 関連付けて記録することで 深度の度合いを変えて 遊べるのです 目が近くや遠くのものに 焦点を合わせるように― 深度を調整できます 例えばすぐ近くの手に― 最適な深度を見つけることも可能です 1つの手になりました 次は後ろの車に合わせて 深度の度合いを変えていきます 奥の車には合っていません この車にも合わせましょう
これがデュアルカメラの ストリーミングです (拍手)
これはAVDualCamのグラフです デュアルカメラのデバイス入力は 1つしか ありません しかし広角と望遠のフレームは 2つのVideoDataOutputsに 接続します 下のほうにあるのは AVCaptureDataOutputSynchronizerです ハードウェアの同期を 行うものではありません これはセッションの下部にある オブジェクトで 複数のコールバックを 一度で行えます 別々にコールバックする 必要はありません DataOutputSynchronizerにより 一度のコールバックで 両方のフレームを得られます その下に 魔法をかける Metal Shader Filter / Compositorが それらのフレームを合成し プレビューで表示する場所を決めます AVAssetWriterに送り ビデオトラックに記録することも
前の図表に戻ります
デュアルカメラの AVCaptureDeviceInputをお見せしました デュアルカメラの入力ポートは どれでしょうか? 2つのビデオポートが?
ありませんね これらの入力ポートから 広角と望遠の両方を得るには? 1つのポートから両方を? いいえ 広角か望遠かではなく デュアルカメラが ズーム比に適したものを決めます では両方のストリームを 同時に得るには?
今から教えることは 誰にも話さないでください バーチャルデバイスには 秘密のポートがあります そのポートは―
今まで隠れていました ポートのアレイにはなく ある要求をすると 得られるのです あらゆるタイプの ポートのアレイを得ると カメラに使えないポートも 含まれます だから名前で要求を dualCameraInputに ポートのデバイスタイプを “WideAngleCamera” “TelephotoCamera”と入力 すると秘密のポートを得られます 入力ポートを得たら それを接続できますが 手動で接続を作成するのと 同じ方法です これで両方から ストリーミングできます
AVDualCamの実演で 広角と望遠カメラの 深度の度合いを変更し 調整しました すべてを動かすのではなく 基準線に沿って動かし コントロールしただけです それはAVFoundationの ホモグラフィのおかげです ホモグラフィは 2つの画像を関連付けます コンピュータビジョンの基礎で 画像の修正や レジストレーションに使います
カメラ内部パラメータは iOS 11で発表しました 3×3の行列で表される 幾何学上のカメラのプロパティです その焦点距離と光学中心には ピンホールカメラを用います ピンホールを通過して 達するのが光学センサーで その距離が焦点距離です
フレームのパラメータを取得するには AVCaptureConnectionに 提供を求めるメッセージを送ります すると すべての ビデオデータの出力バッファに 添付されます CameraIntrinsicMatrixは 3×3の行列を送る simdタイプのNSDataです 広角のフレームには 広角カメラの行列 望遠のフレームには 望遠カメラの行列が付きます
iOS 13には カメラ外部パラメータを採用 外部パラメータは回転行列と 並進ベクトルが1つの行列の中に―
押し込まれたものです 基準と比較した カメラのポーズを表します 2つのカメラの位置や傾きを 関連付けるのに役立つものです AVDualCamはこれを使い 広角と望遠のフレームを並べます それにより視点も変えられるのです
内部と外部パラメータの 簡単な説明でした 2年前のセッション507で長々と 詳細の説明を 冗談が苦手でなければ 見直してみてください (笑い声) マルチカムキャプチャの 最後のトピックは マルチマイクキャプチャです
従来のAVCaptureSessionでの デフォルト動作を見てみましょう
単純にマイクはカメラに従います フロントカメラが セッションにあれば マイクはどうなるか? フロントカメラと同じ向きの マイクが選ばれます バックも同様です カージオイド型になるので 不要な音は拾いません 背面でも前面でも 対象を追跡できます 音声だけのセッションで 方向が不明な時は 無指向性という選択も すべて停止するには こう指示を “自分のAVAudioSessionを 使って―” “自分で音声を設定したい”
もう1つの秘密を教えましょう
実はフロントマイクなど 存在しません iPhoneにはマイクのアレイが含まれ デバイスにより番号が違います 最新のiPhoneは4でiPadは5 位置も戦略によって異なります 最新のiPhoneは下部に2つと 上の両側に1つずつあり すべて無指向性マイクです 上の両側のマイクは デバイスが隔壁となり 音響が分離します それでも指向性に満足できません ではフロントやバックマイクに 似せるには何をするか? マイクロフォンビームフォーミングです これは低い音声信号を 指向性にする処理の方法で Core Audioの機能です この青い点はiPhoneの 両側のマイクを表しています 円は それらの無指向性マイクが 拾う音声のパターンです それらの信号を抜き出すと 8の字になります それも悪くありません もっとよくするには キープしたいほうに感度を加えます パックマンのゴーストの形です 不要なものを取り除きましたが 信号が弱まって 静かになりすぎます しかし この信号に さらに感度を加えると 目的の美しいカージオイド型に なりました 脇からの不要な音は拾いません これは簡略化した説明です ホワイトノイズを防ぐ必要が ありますが 概要は このとおりです 今までビームフォーミングは 1つでしたが Core Audioのチームが マルチカムに大きな貢献を iOS 13では 同時に複数の ビームフォーミングをサポートします (拍手) AVCaptureSessionに戻ります マイクのデバイス入力の 音声ポートは 多くの役割を受け持っています カメラによって どのマイクにもなるのです しかしMultiCamSessionは 融通が利きません 1つ目の音声ポートは常に 無指向性です そしてビームフォーミングを 得るために 先ほどの秘密のポートがあります それを得るには先ほどと同じ―
入力ポートの取得法を 今回は位置を指定します 前後どちらかの位置を指示すると― 目的のポートと ビームフォーミングを得られます
こちらが前で― こちらが後ろです
MultiCamPiPの実演では ビデオのすばらしい面を お見せしました 今度は音声について話します 1つのデバイス入力には―
前と後ろに1つずつ 2つのビームフォーミングが それらを稼働する 2つのAudioDataOutputから どちらかが選ばれます どちらが大きいかによって― 前後どちらかの ビームフォーミングが得られます
マルチマイクキャプチャの ビームフォーミングは内蔵マイクのみで 外部からのUSBなどには 対応できません
AirPodsなど他のものをつなぐと もちろん音声は読み込めます ビームフォーミングは できないので すべての入力を通してつなぎ 信号を保ちます
マルチカメラキャプチャの話は 以上です 簡単に要約を
マルチカムキャプチャの セッションは iOSで複数のカメラを使う方法です パワーツールですが 制限もあります
ハードウェアとシステムの負担による コストには慎重に
同時ストリーミングは バーチャルデバイスで マルチマイクキャプチャでは ビームフォーミングと無指向性を 次はセマンティックセグメンテーション マットのお話です (拍手)
セマンティック セグメンテーションマットという 新しいマットの話を今日はします 後半ではCore Imageへの 活用法を紹介します
iOS 12の ポートレートエフェクトマットは ポートレートで エフェクトを適用するマットでした 美しいポートレートモード写真の 生成に使われています ポートレートのマットを見てみましょう 背景を除いた人物だけが 描写されています 黒色と白色に分かれたマットです 1の値が前景 0の値が背景を示します
iOS 13ではマットを さらに進化させました 髪のマットと―
肌のマット
そして歯です
髪のマットを見てみましょう 髪のある部分だけが― きれいに分かれています 髪の毛の細かい情報も描かれ 肌の部分とも ちゃんと分かれています
また 肌のマットには アルファ値が含まれ ピクセルの肌の割合を示します 0.7のアルファ値が示すのは 70%が肌ということです この新しい3つのマットを使えば すてきな写真やエフェクトを 作る自由度が増すでしょう
実は マットは元の画像の 半分のサイズなので 縦横は半分の長さで 解像度は4分の1になります また ポートレート エフェクトマットと 特に肌のマットは 部分的に一致しています
生成にはNeural Engineによる 機械学習を最大限に生かしています 内部処理ではオリジナルサイズの画像を Neural Engineに渡します 高品質画像を一貫性のあるマットで レンダリングします そして マットは被写界深度と共に HEIFやJPEGファイルに格納できます
マットの生成には2つの方法があります ポートレートモードの 写真から引き出す方法と 自分でキャプチャーアプリケーションを 作る方法です マットを格納したファイルがあれば Core ImageとImage I/Oが 使えます まずはAVFoundation APIを 使った方法です
4つの段階があります 1つ目はAVCapturePhotoOutputの設定 次はアプリケーションで 取得リクエストが開始された時 そして キャプチャ用に 設定が解決され 最後は写真の処理が終わった時です それぞれの詳細は2017年のセッションを 参考にしてください
まずはAVCapturePhotoOutputの 設定から見ていきます beginConfigurationを呼び プリセットを決め デバイスの入力と AVCapturePhotoOutputを追加しました ここで どのマットを生成するかを APIに伝えます
そして リクエストを開始する時は AVCapturePhotoSettingsを指定して APIに伝えます 有効にしたすべての設定や 髪や肌を指定できます リクエストを開始すると AVCapturePhotoSettingsに渡り 通知先に渡ります それから時間がたつと― コールバックに willBeginCaptureForが戻ります 実際に取得したものを この時 APIが知らせてくれます これはマットにとって重要です 人物がいない場合 マットはできません ですから サイズが0でないか 確認する必要があります
そして 処理が完了しました ここでセマンティック セグメンテーションマットが戻ります ポートレートエフェクトマットと 同じメソッドとプロパティです そのため Exif情報から 画像を回転させたり CVPixelBufferを参照できます
詳しい情報はサンプルアプリケーション AVCamを参照してください セマンティックセグメンテーション マットが追加されています
では 同僚と変わります (拍手)
ありがとう セグメンテーションマットについて Core Imageでの 活用方法を紹介していきます 今からデモを見せますが クラウンの写真が出てきます もしクラウン恐怖症の人や 苦手な人がいれば 目を閉じてくださいね ポートレートモードで撮った写真です このアプリケーションでは 写真にある それぞれのマットを 簡単に表示させられます 従来のポートレートエフェクトマットや こちらは肌のマットです さらに髪や歯のマットもあります またCore Imageで 合成することもできます 例えば 論理演算を用いて合成した 目と口だけのマットです 元の写真で 私はApple Parkにいます ポートレート エフェクトマットを使えば 背景を簡単に追加できます 背景をサーカスのテント内に 変えました ですが 私の写真が背景から 浮いています では エフェクトを加えてみましょう 例えば クラウンの化粧や もっと本格的に 髪を緑色にしてもいいですね 別のマットで 化粧も追加しました 今からアプリケーションへの 実装方法を紹介します (拍手) もうクラウンは登場しませんので 安心してください
では Core Imageを使って マット画像を生成する方法 フィルターの適用方法 保存方法を説明します まずはマット画像の生成方法です 2つの方法があり 1つ目はAVCapturePhoto APIの使用です それからCore Imageを使います semanticSegmentationMatte APIを使い 髪や肌 もしくは歯を指定します 結果 AVSemanticSegmentationMatteの オブジェクトが返り CIImageを簡単に生成できます インスタンスの生成もできます 2つ目はHEIFかJPEGファイルから 読み込む方法です ファイルはRGB画像を格納しています さらに補助画像である ポートレートエフェクトマットや 髪や歯のセグメンテーションマットを 含んでいます HEIFファイルからCIImageを 生成するにはCIImageと書いて URLを指定するだけですね 補助画像を生成するのも同じで オプションで どのマット画像を返すか 指定するだけです 髪なら auxiliarySemantic SegmentationHairMatteなど― 各マットをオプションで指定できます 数行のコードでシンプルです
次は 画像への エフェクトの適用方法です 先ほどのエフェクトを 詳しく紹介します まず ベースのRGB画像から始めます さらに クラウンの色あせた白い化粧の エフェクトを出すために 写真を調整します 写真全体ではなく 調整を肌だけに適用したいので 肌のマットを使います 3枚を合成すれば 期待した結果が出ます
コードはとてもシンプルです 実はその前に 報告があります 200以上あるフィルターが 使いやすくなりました それが新しいCIFilterBuiltinsです フィルターや入力の名前を覚えなくても フィルターが使えます (拍手) このヘッダーを使って コードを紹介します まずはベースとなる画像を生成します 従来のRGB画像ですね 次はエフェクトです まずはグレースケールにします フィルターはmaximumComponentです 画像をフィルターに渡し 出力するよう― コードを書きます 結果 グレースケールになりました まだ 白さが足りないので ガンマを調整する フィルターを追加します 入力は先ほど出力した画像です そして ガンマの値を指定して 出力を求めます ガンマの値はFloat型で 指定できるので NSNumberよりとても簡単です
最初のエフェクトの完成です 次の工程に移ります
肌のマットを取得します 先ほどと同様に 肌のマットを取得するよう指定します しかし マットの画像は オリジナルの半分のサイズです
そこで サイズを合わせます CGAffineTransformMakeScaleを使って マット画像を変形させます サイズが正しい画像が生成されました
次は2つの画像を合成します blendWithMaskフィルターを使います まずは このRGB画像を 背景として設定します 次に前景となる― 白い化粧のエフェクトを加えた画像を 指定します そして最後に マスクを指定します 先ほど お見せした画像ですね この3つをフィルターにかけると こうなります 他にもエフェクトを組み合わせて 面白いものが作れますよ
エフェクトの適用後は 補助画像の保存に対応している― HEIFかJPEGで保存します メイン画像に加え マットを格納すれば 他のアプリケーションでも 使えますからね
Core Imageの writeHEIFRepresentation APIで 保存したいメイン画像とURLを 指定します ピクセルフォーマットと カラースペースも指定します さらに 別のオプションを 追加することができます セグメンテーションマットを指定すれば 肌のマットや髪― 歯のマットを保存できます これらすべての画像が HEIFやJPEGで保存されます また 別の方法でも保存できます AVSemanticSegmentationMattesの オブジェクトです APIはシンプルで メイン画像から カラースペースまで指定します この場合 マット画像を保存するには AVSemanticSegmentationMattesで 指定するだけです
マットの活用方法を紹介しました マット画像の生成方法 フィルターの適用と保存方法です デモは写真Appのプラグインとして 書かれたものです HEIFだけでなくPhoto Libraryに 保存する方法を知りたい方は 過去のセッションを参考にしてください 特に2014年の“Introducing the Photos Frameworks”です
ありがとうございました 皆さん 頑張ってください 以上です (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。