gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:58:08 27 4
gpt4 key购买 nike

我们正在使用ARKit中人们的遮挡来开发演示应用程序。因为我们想在最终场景中添加视频,所以我们使用SCNPlane来使用SCNBillboardConstraint渲染视频,以确保它们朝向正确的方向。这些视频也部分透明,在我们应用的SCNMaterial上使用自定义着色器(因此一次播放2个视频)。

现在,我们遇到了一些人们的遮挡非常棘手的问题(见图)。我们正在测试的视频是一个穿着深色裤子和一条裙子的女人(如果您想知道图像中的黑色是什么)。

我们遇到的问题是,遮挡并不总是与人对齐(如图所示),并且不能总是正确地检测到某人的头发。

现在我们的问题是导致这些问题的原因是什么?以及如何改善问题,直到问题看起来像this为止?我们目前正在研究问题是否是因为我们正在使用飞机,但是仅使用SCNBox不能解决问题。

enter image description here

最佳答案

更新:2020年10月29日
借助新的 Depth API 和更高质量的ZDepth通道(可以60 fps捕获),可以提高ARKit 4.0中People OcclusionObject Occlusion功能的质量。但是,为此,您需要配备LiDAR扫描仪的iPhone 12 Pro或第四代iPad Pro 2020。
但是在ARKit 3.0中,除非使用Metal或MetalKit,否则无法改善People Occlusion功能。但是,相信我,使用Metal-family框架很难在ARKit 3.0中改进People Occlusion
技巧:考虑到 RealityKit AR QuickLook 框架也支持People Occlusion

为什么在使用人员遮挡时会发生此问题?
这是由于第五个 channel 的性质– ZDepth channel 。我们都知道,渲染的3D场景最终图像可以包含5个用于数字合成的主要通道- Red Green Blue Alpha 和。
enter image description here
当然,还有其他有用的合成渲染通道(也称为AOV): ZDepth Normals MotionVectors PointPosition ,此处唯一主要渲染集– UVs Disparity

ZDepth通道在ARKit 3.0中具有三个严重缺陷。

Problem 1. Aliasing and Anti-aliasing of ZDepth.


默认情况下,在任何高端软件(如Nuke,Fusion,Maya或Houdini)中渲染ZDepth通道都会导致 锯齿状边缘或所谓的别名边缘。游戏引擎也不异常(exception)-SceneKit,RealityKit,Unity,Unreal或Stingray也存在此问题。
当然,您可以说在渲染之前我们必须打开一个名为 RGBA的功能。而且,是的,它几乎适用于所有 channel ,但不适用于ZDepth。 ZDepth的问题是–如果将每个前景对象(特别是透明的)的边界像素“ ZDepth”“转换”为背景对象。换句话说,FG和BG的像素在FG对象的边缘上混合。
坦白地说,有一个解决深度问题的可行解决方案–您应该使用 Anti-aliasing 而不是 anti-aliased 。但是没有一个游戏引擎支持它,因为 Deep channel 非常庞大。因此,深通道补偿既不适用于游戏引擎,也不适用于ARKit。唉!
enter image description here

Problem 2. Resolution of ZDepth.


即使 RGB Alpha 通道都只是 8位通道,常规 ZDepth 通道也必须以 32位呈现。 32位文件的颜色位深度对于CPU和GPU来说是沉重的负担。并记住有关在ARKit视口(viewport)中合成几层的知识–这是在3D模型和背景角色上合成前景角色的方法。即使这些文件是在 viewport resolution而不是在实际的屏幕rez上合成的,您是否也不认为这对您的设备来说太大了?但是,在 16位 8位 ZDepth channel中渲染 ZDepth 通道可对实际场景的深度进行编码,从而降低了合成质量。
为了减轻CPU和GPU的负担并节省电池寿命,Apple工程师决定在捕获阶段使用缩小的ZDepth图像,然后将渲染的ZDepth图像放大到视口(viewport)分辨率,并使用Alpha通道对其进行 Stencil (也称为分段),然后使用 Dilate 合成操作修复ZDepth通道的边缘。因此,这导致我们看到了如此令人讨厌的假象,我们可以在您的图片上看到它们(某种“痕迹”)。
enter image description here
enter image description here
请查看 Deep channel here演示幻灯片pdf

Problem 3. Frame rate of ZDepth.


第三个问题源于ARKit在 60 fps 下工作的事实。仅降低ZDepth图像分辨率并不能完全解决问题。因此,对于苹果工程师来说,下一个合理的步骤是–在ARKit 3.0中将ZDepth的帧频降低为 15 fps 。但是,最新版本的ARKit 4.0可以60 fps捕获ZDepth通道,这大大提高了人员遮挡和对象遮挡的质量。但是在ARKit 3.0中,这也带来了伪像(ZDepth通道的某种“丢帧”,导致“拖尾”效果)。
使用类型属性时,无法更改最终合成图像的质量:
static var personSegmentationWithDepth: ARConfiguration.FrameSemantics { get }
因为它是一个可获取的属性,并且ARKit 3.0中没有ZDepth质量的设置。
而且,当然,如果要在ARKit 3.0中提高ZDepth通道的帧速率,则应实现在数字合成中发现的 帧插值技术(中间的帧是计算机生成的):
enter image description here
但是这种帧插值技术不仅占用大量CPU,而且非常耗时,因为我们需要每秒生成45个额外的32位ZDepth帧(45个插值+ 15实数= 60帧/秒)。
我相信有人可以通过使用Metal开发代码来改进ARKit 3.0中的ZDepth合成功能,但这是一个真正的挑战!

You must look at sample code of People Occlusion in Custom Renderers app here.



ARKit 4.0和LiDAR扫描仪支持
在ARKit 4.0和ARKit 3.5中,支持LiDAR( compresses扫描仪)。由于ZDepth通道的质量更高,因此即使在跟踪周围环境时 body 并不移动,LiDAR扫描仪也可以提高人员遮挡功能的质量和速度。 LiDAR系统还可以帮助您绘制墙壁,天花板,地板和家具的 map ,以快速获取虚拟网格,以使现实表面与之动态交互,或简单地在其上定位3d对象(甚至部分遮挡的3d对象)。配备LiDAR扫描仪的小工具可以检索真实表面的位置,实现无与伦比的准确性。通过考虑网格,射线可以与非平面表面或完全没有特征的表面(例如白墙或几乎不发光的墙)相交。
要激活 Bringing People into AR选项,请使用以下代码:
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)
enter image description here
但是在代码中使用 Light Detection And Ranging实例属性之前,您需要检查设备是否具有LiDAR扫描仪。您可以在 sceneReconstruction文件中执行此操作:
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
}
}

RealityKit 2.0
在iPhone 12 Pro或iPad Pro 2020上使用RealityKit 2.0应用程序时,您有几个遮挡选项– ARKit 4.0中提供了相同的选项– 改进了 sceneReconstructionAppDelegate.swift(例如,家具或墙壁)和 People Occlusion。要在RealityKit 2.0中打开遮挡,请使用以下代码:
arView.environment.sceneUnderstanding.options.insert(.occlusion)

关于swift - 如何改善ARKit 3.0中的人物遮挡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58269394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com