为什么要获取深度图?深度图的作用?
随着AR和VR技术的发展以及最近元宇宙概念的爆火,很多公司都开始着手于AR和VR技术,提到VR技术,就离不开空间建模与计算机视觉感知,而这些与深度图息息相关,我们不仅可以通过深度图达到空间建模的目的,也能够通过深度图感知到物体离视点的距离信息。所以了解如何获取深度图,对于想要接触3D开发的同学来说至关重要。
深度图概念
在3D计算机图形和计算机视觉中,深度图是一种图像或图像通道,其中包含与场景对象的表面到视点的距离有关的信息,用于模拟的3D形状或重建他们。深度图可以由3D扫描仪生成或从多个图像重建。
深度图像获取原理
- 双目测距原理
- 结构光
- 激光雷达
- tof相机 具体原理可参考:深度图像获取原理
深度图和彩色图的关系
彩色图就是我们平时看到的图片,包含了rgb信息,是三通道的,每个通道为8位,均为0-255的值, 而深度图只包含了深度信息,为单通道图片,可以为8位,也可以为16位,16位深度图精度更高一点。
iOS开发获取深度图的方式
通过ARKit获取深度图
开启ARKit
- 创建 ARSCNView 对象。
- 创建世界追踪配置 ARWorldTrackingConfiguration 对象 config。
- 判断iOS系统版本 和 当前设备是否支持激光雷达 来确定配置config。
- 确定config 后将其应用于 ARSCNView 对象的 session 属性,并调用session的 run 方法,至此ARKit开启完毕。
获取深度图对象
ARKit 开启完毕后,我们可以通过 sceneView.session.currentFrame 获取当前帧的图像数据。 currentFrame中包含了 sceneDepth 和 smoothedSceneDepth 两个深度属性,这两个属性都包含了当前帧的深度数据,使用哪个属性取决于你在开启ARKit时的配置config,如果你设置了config.frameSemantics = .smoothedSceneDepth 则可以获取到smoothedSceneDepth,反之,如果你设置config.frameSemantics = .SceneDepth 则可以获取到sceneDepth,两者的区别就是smoothedSceneDepth 增加了平滑效果。两者都是 ARDepthData 对象
然后我们可以通过 ARDepthData 对象获取到当前帧的如下所示深度数据
depthMap就是深度图
confidenceMap是置信图
Demo
效果:
通过苹果官网的深度学习模型获取深度图
通过上述链接进入到以下页面,然后选取红色箭头所指向的深度推测模型
关于深度推测机器学习的模型如何使用,可参考下面这个github仓库:
深度推测的效果显然没有使用激光雷达的方式更准确,且应用场景比较单一(只对其大量训练过的场景效果好,对于复杂场景效果很差)