ARKit之路-Depth API

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  在配备LiDAR传感器的设备上,ARKit不仅可以进行场景几何重建,还向开发者开放了场景深度信息,利用这些深度信息,可以实现更加自然、无缝的虚实体验。并且,ARKit提供的深度信息是逐像素的,因此,可以实现非常精细的效果,如精确的控制特效的范围,营造与现实融合度非常高的虚实效果。

  从ARKit中获取到的深度信息是指从设备摄像头到现实场景中各点的深度值,这些值每一帧都会产生,生成速率大于等于60FPS,即这些深度值是实时的,因此可以实现实时的动态深度效果,如遮挡、物理仿真、边界处理。

  得益于LiDAR传感器,ARkit可以采集到稠密的离散深度值,但这还不足以形成逐像素的深度图(Depth Map),为得到逐像素的深度图,ARKit融合了RGB摄像头图像数据与LiDAR传感器数据,如下图所示。利用计算机视觉算法,ARKit将RBG图像数据与LiDAR传感器数据进行融合计算,既保证了精度,又保留了物体边缘,最终提供给开发者一张与当前场景图像一致的深度图,为节约内存使用,这张深度图尺寸比RGB场景图略小,深度图中每个像素代表了场景点到设备摄像头的距离(单位为米)。

在这里插入图片描述

  由于LiDAR的特性,对穿透性强或者吸收性强(如玻璃、高吸光性材质)的物体测量存在先天的不足,因此,LiDAR采集到的数据也存在误差很大的异常数据,为描述这些异常数据,ARKit另建了一张尺寸与深度图一致的置信度图(Confidence Map),这张图中每一个像素与深度图中的像素一一对应,但每一个像素均描述了深度图中对应像素的可信值,这个可信值由ARConfidenceLevel枚举描述,该枚举各值如下表所示。

枚举值描述
low深度图中对应像素可信值为低
medium深度图中对应像素可信值中等
high深度图中对应像素可信值为高

  置信度图描述了深度图中每一个像素的可信度,在开发应时,我们就可以针对不同置信度的深度信息进行不同的处理,提高对场景把控的灵活性。

  从ARKit获取深度图,需要开启Depth API功能,可以直接通过设置语义开启,当启用人形遮挡时默认会自动开启,典型代码如代码清单1所示。

//直接设置语义开启场景深度Depth API
let configuration = ARWorldTrackingConfiguration()
if type(of: configuration).supportsFrameSemantics(.sceneDepth){
      configuration.frameSemantics = .sceneDepth
 }
arView.session.run(configuration)

//启用人形遮挡时会自动开启场景深度Depth API  
let configuration = ARWorldTrackingConfiguration()
let sematics:ARConfiguration.FrameSemantics = [.personSegmentationWithDepth]
if type(of: configuration).supportsFrameSemantics(sematics){
     configuration.frameSemantics = sematics
}
arView.session.run(configuration)

在配置中开启Depth API功能后,我们就可以通过session(_ session: , didUpdate frame: ) 代理方法获取到深度图与置信度图,如代码清单2所示。

//从每一帧中得到场景深度图与置信度图
public func session(_ session: ARSession, didUpdate frame: ARFrame) {
     guard let depthData = frame.sceneDepth else { return }
     let depth = depthData.depthMap
     let confidence = depthData.confidenceMap
     ...
} 

提示:
frameSemantics语义属性用于设置特定配置的可选帧特性(Frame Features),当前可设置的值有4个,分别为:sceneDepth、bodyDetection、personSegmentation、personSegmentationWithDepth,其中sceneDepth用于开启Depth API,bodyDetection用于肢体检测跟踪,后两个用于人形遮挡,personSegmentation可现实屏幕空间的人形分离,而personSegmentationWithDepth则是带有深度信息的人形分离,后3个值我们将在第7章中具体学习。

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_DavidWang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值