苹果相机中的深度数据那些事儿在目前的 iPhone 上,相机组件可以有多种方式来获取深度信息,可以在

文章正文
发布时间:2025-02-12 10:59

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

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

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

普通相机中的 AVDepthData

普通相机,也就是不开启 ARKit 时,直接启动相机拍照或录视频时,是可以直接获取深度信息的。可以是使用前置 TrueDepth 来获取深度,也可以是用后置双目视差。另外,自 iOS 15.4 起支持 LiDARDepthCamera 相机类型,也终于可以用激光雷达来获取相片深度了。

需要说明的是,双目相机可以是:广角(即主摄)+ 超广角,广角(即主摄) + 长焦。按照苹果的说明,三目现在是不支持的深度的,另外双目情况下,如果调整了相机参数:曝光、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 Photography 与 Capturing 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 捕捉到的场景深度图,以及人体分割得到的人体深度图等。

具体在 ARFrame 中的对应属性如下:

/** 前置 TrueDepth 相机捕捉到的深度图。需要开启 ARFaceTrackingConfiguration 配置项,且帧率与 RGB 相机不同 */ @available(iOS 11.0, *) open var capturedDepthData: AVDepthData? { get } /** 人体识别分割图像后的深度图。需要设置 personSegmentationWithDepth,分辨率较低 @see -[ARConfiguration setFrameSemantics:] @see -[ARFrame segmentationBuffer] */ @available(iOS 13.0, *) open var estimatedDepthData: CVPixelBuffer? { get } /** 场景的深度图。需要 LiDAR @see ARFrameSemanticSceneDepth. @see -[ARConfiguration setFrameSemantics:] */ @available(iOS 14.0, *) open var sceneDepth: ARDepthData? { get } /** 平滑处理过的场景深度图。需要 LiDAR @see ARFrameSemanticSmoothedSceneDepth. @see -[ARConfiguration setFrameSemantics:] */ @available(iOS 14.0, *) open var smoothedSceneDepth: ARDepthData? { get }

其中 capturedDepthData 是前置 TrueDepth 相机捕捉到的深度图,而 sceneDepth 是依赖 LiDAR 获取到的场景深度图(会自动排除场景中的人体),都比较好理解。

最让人费解的是 estimatedDepthData ,这个人体识别后,得到的深度图是个什么玩意?为什么不需要 LiDAR 和双目镜头就能得到人体深度?为什么没有 LiDAR 时得到的深度非常不准确?

其实,苹果在 WWDC19:Bringing People into AR 中讲得很清楚,这个人体分割图和深度图,是利用 A12 处理器和机器学习从摄像头的图像中得到的:Now, the amazing thing about this feature is that the way we're generating these buffers is by leveraging the power of the A12 chip and using machine learning in order to generate these buffers, using only the camera image

也就是说,这个人体深度图,是利用相机图像和机器学习得到的,这说明用单摄像头的二代 SE 手机或 iPad Pro 2018 就能实现,在有 LiDAR 的设备上可以更准确,但是苹果并没有说明是否用到了双目视差。个人估计,很可能没有用到双目视差,只用到了单目 VIO 数据,因为视差得到的深度在 3D 中不准确,而且需要多开启一个摄像头,硬件本身费电的同时,运算量大幅上升软件也更费电,总体得不偿失。

因此,截止 2021 年,苹果在 AR 中根本没有使用双目视差技术来获取深度。这也解释了,为什么有了 LiDAR,人体分割的边缘仍然没有提升。这是因为 LiDAR 点云虽然精确但太稀疏,提升的只是人体深度的精确性,边缘仍然只是依赖单目 RGB 进行处理。

下面是 B 站钟文泽的测试对比,可以看到在 AR 中,单摄像头的 iPad Pro 2018 也可以得到人体深度,只是相比拥有 LiDAR 的 2020 款不太准确:

最后,虽然在 AR 中并没有直接用到双目视差,并不代表双目视差技术与 AR 无关。今年的 WWDC21 中,苹果新推出的 RealityKit Object Capture 功能,就可以利用拍照的双目视差深度图,来帮助重建 3D 模型。有了深度信息,重建出的 3D 模型大小与真实物体更加接近,质量也会更高。

首页
评论
分享
Top