iOS开发三维建模-如何获取深度图

1,013 阅读3分钟

为什么要获取深度图?深度图的作用?

随着AR和VR技术的发展以及最近元宇宙概念的爆火,很多公司都开始着手于AR和VR技术,提到VR技术,就离不开空间建模与计算机视觉感知,而这些与深度图息息相关,我们不仅可以通过深度图达到空间建模的目的,也能够通过深度图感知到物体离视点的距离信息。所以了解如何获取深度图,对于想要接触3D开发的同学来说至关重要。

深度图概念

在3D计算机图形和计算机视觉中,深度图是一种图像或图像通道,其中包含与场景对象的表面到视点的距离有关的信息,用于模拟的3D形状或重建他们。深度图可以由3D扫描仪生成或从多个图像重建。

深度图像获取原理

  1. 双目测距原理
  2. 结构光
  3. 激光雷达
  4. tof相机 具体原理可参考:深度图像获取原理

深度图和彩色图的关系

彩色图就是我们平时看到的图片,包含了rgb信息,是三通道的,每个通道为8位,均为0-255的值, 而深度图只包含了深度信息,为单通道图片,可以为8位,也可以为16位,16位深度图精度更高一点。

iOS开发获取深度图的方式

通过ARKit获取深度图

开启ARKit

  1. 创建 ARSCNView 对象。
  2. 创建世界追踪配置 ARWorldTrackingConfiguration 对象 config。
  3. 判断iOS系统版本 和 当前设备是否支持激光雷达 来确定配置config。
  4. 确定config 后将其应用于 ARSCNView 对象的 session 属性,并调用session的 run 方法,至此ARKit开启完毕。

截屏2022-02-03 下午2.11.04.png

获取深度图对象

ARKit 开启完毕后,我们可以通过 sceneView.session.currentFrame 获取当前帧的图像数据。 currentFrame中包含了 scene​Depth 和 smoothed​Scene​Depth 两个深度属性,这两个属性都包含了当前帧的深度数据,使用哪个属性取决于你在开启ARKit时的配置config,如果你设置了config.frameSemantics = .smoothedSceneDepth 则可以获取到smoothed​Scene​Depth,反之,如果你设置config.frameSemantics = .SceneDepth 则可以获取到scene​Depth,两者的区别就是smoothed​Scene​Depth 增加了平滑效果。两者都是 ARDepth​Data 对象

ARDepth​Data详解

然后我们可以通过 ARDepth​Data 对象获取到当前帧的如下所示深度数据

截屏2022-02-03 下午2.22.28.png

depthMap就是深度图

截屏2022-02-03 下午2.24.04.png confidenceMap是置信图 截屏2022-02-03 下午2.24.28.png

Demo

GitHub Demo地址

效果:

IMG_0656.PNG

通过苹果官网的深度学习模型获取深度图

官方训练好的机器学习模型

通过上述链接进入到以下页面,然后选取红色箭头所指向的深度推测模型 截屏2021-12-02 下午9.47.32.png

关于深度推测机器学习的模型如何使用,可参考下面这个github仓库:

深度推测机器学习模型使用

深度推测的效果显然没有使用激光雷达的方式更准确,且应用场景比较单一(只对其大量训练过的场景效果好,对于复杂场景效果很差)

通过视差获取深度图

深度图相关处理简单示例