デプス(深度)をiOSで扱う方法を網羅したサンプルコード集
原始のiPhoneからカメラは搭載されていましたが、デプス(深度)が取れるデュアルカメラやTrueDepthカメラが搭載されたのは比較的最近のことです。従来のカメラやGPSが、デジタルの世界と我々が生きる現実世界を繋ぐ重要な役割を担い、アプリ開発者に多くの創造性を与えてくれたのと同様に、「奥行き」がわかるようになったというのはアプリ開発の次元がひとつ増えたようなもの。そのわりに、深度関連APIにどのようなものがあるか、何ができるか、どう実装するのか、という情報は日本語はもちろん、英語でもあまり多くはありません。
そこで、iOSにおけるデプス(深度)関連APIの実装方法を示すサンプル集「iOS-Depth-Sampler」を作成し、オープンソースで公開しました。
ソースコードは GitHub に置いてあるので、ご自由にご活用ください。Swift 4.2、ライセンスはMITです。
今のところ6つのサンプル(後述)が入っています。本記事のタイトル「網羅した」は少し大げさですが、撮影済みの写真からデプスを取得する方法から、リアルタイムに取得する方法、ARKitで取得する方法、フロント/リアカメラ、Disparity / Depth / Portrait Matteといったタイプと相互変換、デプスを利用した背景合成や3D空間へのマッピングといったサンプルも備えています。
(2次元の写真をデプスを利用して3D空間へマッピング)
(深度を用いた自動背景除去)
今後iOSにデプス関連の機能が追加されるたびに、サンプルも追加していく予定です。
利用可能なデバイス
デュアルカメラもしくはTrueDepthカメラを持つデバイスを使用してください。
2018年9月現在、7 Plus, 8 Plus, X, XS, XRが対象機種です。お持ちの方はぜひビルドして遊んでみてください。リア(Dual Camera)とフロント(TrueDepth Camera)でそれぞれサポートしている機能が全然違うので、X or XSが理想です。
利用方法としてはXcode 10でビルドしてiOS 12端末にインストールするだけですので、デザイナーやディレクターの方々もぜひお近くのプログラマにビルドしてもらってお手元で試してみてください。
サンプル一覧
Real-time Depth
リアルタイムにカメラから深度情報を取得し、可視化するサンプルです。
Real-time Depth Mask
リアルタイムにカメラから取得した深度情報をマスクとして使用し、背景合成を行うサンプルです。
Depth from Camera Roll
カメラロールにある撮影済みの写真から深度情報を取り出し、可視化するサンプルです。標準のカメラアプリのポートレートモードで撮影した写真を利用できます。
Portrait Matte
Portrait Matte (Portrait Effect Matte)を使用し、背景を除去するサンプルです。ポートレートモードで「人間を撮影」した写真を利用できます。要iOS 12。
カメラはフロント・リアどちらもOKです。
関連記事:
ARKit Depth
ARKitで深度情報を取得し、可視化するサンプルです。
現状、ARKitでは`ARFaceTrackingConfiguration`使用時のみ(つまりフェイストラッキングARのときだけ)この方法で(※後で貼るスライド内で説明しています)深度情報を取得できます。
2D image in 3D space
写真(2D)を深度をz値として3D空間にマッピングするサンプルです。
AR occlusion
[WIP] An occlusion sample on ARKit using depth.
そもそもデプスって?
「デプスって何?」「何が嬉しいの?」「どういう仕組みで計測してるの?」といったところは拙スライドもご参照ください。iOSエンジニアのカンファレンス「iOSDC Japan 2018」での登壇資料です。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/