9b308ae3e6d583f45db15213fa1b26ac
苹果相机中的深度数据那些事儿

说明

在目前的 iPhone 上,相机组件可以有多种方式来获取深度信息,可以在拍照时或者 ARKit 中使用。但是它们在使用时,有不同的限制和区别:

深度来源 依赖硬件 使用环境
前置深度传感器 TrueDepth 镜头 拍照录像、AR
后置单目 + ML 后置主摄 + ARKit AR 中的人体
后置双目视差 后置双摄 拍照录像
后置 LiDAR 后置 LiDAR 拍照录像、AR

那它们的详细区别是什么?我们来一个一个仔细说说。

普通相机中的 AVDepthData

普通相机,也就是不开启 ARKit 时,直接启动相机拍照或录视频时,是可以直接获取深度信息的。可以是使用前置 TrueDepth 来获取深度,也可以是用后置双目视差,如果有 LiDAR 也可以更好的辅助获取深度,没有也不影响。

需要说明的是,双目相机可以是:广角(即主摄)+ 超广角,广角(即主摄) + 长焦。按照苹果的说明,三目现在是不支持的深度的,另外双目情况下,如果调整了相机参数:曝光、ISO、光圈等,也可能导致无法获取深度。

小技巧:如何不写代码,不装 app,判断设备是不是支持双目深度功能?

  • 打开自带相机-人像模式,对准任意物体都能显示出背景虚化,并能调节景深,就是支持;
  • 如果选择人像后,跳转打开前置相机,说明不支持;
  • 如果选择人像后,必须对准人才能显示背景虚化,对任意物体不能虚化,则也是不支持的,这里的人像是扣图得到的。

注意:根据反馈,在 iPad Pro 上,拍照录像时不支持后置双目获取深度功能,即使是带有 LiDAR 的型号也不可以。

开启双目镜头的代码如下:

let trueDepthCameraDevice = AVCaptureDevice.default(.builtInTrueDepthCamera, for: .video, position: .front)

let dualCameraDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
let dualWideCameraDevice = AVCaptureDevice.default(.builtInDualWideCamera, for: .video, position: .back)
//检查深度是否可用,并启用
var photoOutput = AVCapturePhotoOutput()
photoOutput.isDepthDataDeliveryEnabled =  photoOutput.isDepthDataDeliverySupported

获取到的深度信息在 AVDepthData 中,需要注意的是,深度图的分辨率和帧率与 RGB 图像并不一致。详细可参考 WWDC17:Capturing Depth in iPhone PhotographyCapturing photos with depth 中的介绍。

/**
 @property depthData
 @abstract
    An AVDepthData object wrapping a disparity/depth map associated with this photo.

 @discussion
    If you requested depth data delivery by calling -[AVCapturePhotoSettings setDepthDataDeliveryEnabled:YES], this property offers access to the resulting AVDepthData object. Nil is returned if you did not request depth data delivery. Note that the depth data is only embedded in the photo's internal file format container if you set -[AVCapturePhotoSettings setEmbedsDepthDataInPhoto:YES].
 */
open var depthData: AVDepthData? { get }

WWDC17:Capturing Depth in iPhone Photography 中,苹果以针孔相机为例,详细介绍了双目视差获取深度的原理,并说明了为什么视差获取的深度值与 3D 场景中的不一致,不能将双目视差深度用于 3D 、AR 中。所以,双目视差获取的深度信息,只是相对的深度,目前只用在拍照和录像时,不能直接用在 AR 中。

ARKit 中的深度

当我们开启 AR 后,屏幕上显示的是手机前置镜头或者后置广角镜头的图像(即主摄)。同时可以从 ARFrame 中获取到多种深度信息,比如前置摄像头捕捉到的人脸深度图,后置 LiDAR 捕捉到的场景深度图,以及人体分割得到的人体深度图等。

top Created with Sketch.