swift 如何改进ARKit 3.0中的人物遮挡

xdyibdwo  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(218)

我们正在ARKit中开发一个使用人物遮挡的演示应用。因为我们想在最终场景中添加视频,所以我们使用SCNPlane来渲染视频,以确保他们面向正确的方向。这些视频也是部分透明的,使用我们应用的SCNMaterial上的自定义着色器(因此一次播放2个视频)。
现在我们遇到了一些问题,人物的遮挡非常不确定(见图)。我们用来测试的视频是一个穿着深色裤子和裙子的女人(如果你想知道图像中的黑色是什么)。
我们遇到的问题是遮挡并不总是与人对齐(如图中所示),并且某人的头发并不总是被正确检测到。
现在我们的问题是什么导致了这些问题?我们如何改进这些问题,直到它们看起来像this?我们目前正在探索这些问题是否是因为我们使用了平面,但简单地使用SCNBox并不能解决问题。

avkwfej4

avkwfej41#

更新日期:2023年3月6日

新深度API

您可以在ARKit 3.5 / 6.0中提高People OcclusionObject Occlusion要素的质量,这要归功于新的***Depth API***,该API具有可在60 fps下渲染的高质量ZDepth通道。但是,要获取它,您需要配备LiDAR扫描仪的iPhone或iPad。在ARKit 3.0中,除非使用Metal或MetalKit,否则无法提高People Occlusion要素的质量(所以,这并不容易)。

提示:考虑到RealityKitAR QuickLook框架也支持People Occlusion

为什么在使用人物遮挡时会出现此问题?

这是由于深度数据的本质,我们都知道,3D场景渲染的最终图像可以包含5个主要的数字合成通道-RedGreenBlueAlphaZDepth

当然,还有其他用于合成的有用渲染过程(也称为AOV):NormalsMotionVectorsPointPositionUVsDisparity等。但是在这篇文章中,我们只对两个主要的渲染集感兴趣-RGBAZDepth

ZDepth通道在ARKit 3.0中有三个严重的缺点

问题1. ZDepth的锯齿和反锯齿

渲染ZDepth通道在任何高端软件(如Nuke,Fusion,Maya或Houdini),默认情况下会导致***锯齿状边缘***或所谓的锯齿边缘。游戏引擎也不例外- SceneKit,RealityKit,Unity,Unreal,或Stingray也有这个问题。
当然,你可以说,在渲染之前,我们必须打开一个名为Anti-aliasing的特性。而且,是的,它对几乎所有的通道都能正常工作,但对ZDepth就不行了。ZDepth的问题是-每个前景对象的边界像素(特别是当它是透明的)被“转换”到背景对象中,如果anti-aliased。换句话说,FG和BG的像素在FG对象的边缘上混合。
坦率地说,目前专业合成行业解决深度问题的有效方案只有一个-- Nuke合成器使用Deep channels而不是ZDepth。但是没有一个游戏引擎支持它,因为Deep通道大得吓人。所以深度通道comp既不适合游戏引擎,也不适合ARKit / RealityKit。唉!

问题2. Z深度的分辨率

常规的ZDepth通道必须在32-bit中渲染,即使RGBAlpha通道都是8-bit。深度数据的32位文件对CPU和GPU来说是一个沉重的负担。ARKit经常在viewport中合并几个层。例如,在虚拟模型和真实背景角色上合成真实前景角色。你不觉得这对你的设备来说太多了吗?即使这些层是以视口分辨率而不是真实的屏幕分辨率合成的?但是,在16-bit8-bit中渲染ZDepth通道会压缩真实场景的深度,从而降低合成质量。
为了减轻CPU和GPU的负担并保存电池寿命,苹果工程师决定在捕捉阶段使用缩小的ZDepth图像,然后使用Alpha通道将渲染的ZDepth图像放大到视口分辨率和模板(又称为分割),然后使用扩张合成操作来固定ZDepth通道的边缘。这让我们看到了你的照片上的一些令人讨厌的人工制品(某种“痕迹”)。

请查看Bringing People into ARhere演示幻灯片pdf

问题3. ZDepth的帧速率

第三个问题源于FPS。ARKit和RealityKit的工作速度为60 fps。降低ZDepth图像分辨率并不会减少处理。因此,ARKit 3.0工程师的下一个合理步骤是-将ZDepth的帧率降低到15 fps。然而,最新版本的ARKit和RealityKit渲染ZDepth通道的速度为60 fps。什么大大提高了人遮挡和物体遮挡的质量。但在ARKit 3. 0中,这暴露了伪影(ZDepth通道的某种“降帧”,导致“拖尾”效果)。
使用此type属性时,不能更改合成图像的质量:

static var personSegmentationWithDepth: ARConfiguration.FrameSemantics { get }

因为它是一个可获取的属性,并且在ARKit 3.0中没有ZDepth质量的设置。
当然,如果您想在ARKit 3.0中增加ZDepth通道的帧速率,您应该实现数字合成中的frame interpolation technique(中间帧是计算机生成的帧)。

但是这种帧插值技术是CPU密集型的,因为我们需要每秒生成45个额外的32位ZDepth帧(45个插值+ 15个真实的=每秒60帧)。
我相信有人可能会使用Metal来改进ARKit 3.0中的ZDepth合成特性,但这对开发人员来说是一个真实的的挑战。

ARKit 6.0和LiDAR扫描仪支持

ARKit 3.5....6.0支持激光雷达(Light Detection And Ranging扫描仪)。LiDAR扫描仪提高了人物遮挡功能的质量,因为ZDepth通道的质量更高,即使您在跟踪周围环境时没有物理移动。LiDAR系统还可以帮助您绘制墙壁、天花板、地板和家具,以快速获得用于与真实世界表面动态交互虚拟网格,或者简单地在其上定位3D对象(即使是部分遮挡的虚拟对象)。具有LiDAR的小工具可以实现无与伦比的准确性,检索真实世界表面的位置。通过考虑网格,光线投射可以与非平面曲面或根本没有特征的曲面相交,如白色墙或光线不足的墙。
要激活sceneReconstruction选项,请使用以下代码:

let arView = ARView(frame: .zero)
    
arView.automaticallyConfigureSession = false

let config = ARWorldTrackingConfiguration()

config.sceneReconstruction = .meshWithClassification

arView.debugOptions.insert([.showSceneUnderstanding, .showAnchorGeometry])

arView.environment.sceneUnderstanding.options.insert([.occlusion,
                                                      .collision,
                                                      .physics])
arView.session.run(config)

但在代码中使用sceneReconstruction示例属性之前,您需要检查设备是否具有LiDAR扫描仪。您可以在AppDelegate.swift文件中执行此操作:

import ARKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, 
                       didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        guard ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification) 
        else {
            fatalError("Scene reconstruction requires a device with a LiDAR Scanner.")
        }            
        return true
    }
}

现实工具包2.0
在iPhone Pro或iPad Pro上使用RealityKit 2.0应用程序时,您可以使用多个遮挡选项-ARKit 6.0中提供了相同的选项-改进的People OcclusionObject Occlusion(例如家具或墙壁)和Face Occlusion。要在RealityKit 2.0中打开遮挡,请使用以下代码:

arView.environment.sceneUnderstanding.options.insert(.occlusion)

相关问题