gpt4 book ai didi

swift - ARKit People Occlusion 样本是如何完成的?

转载 作者:可可西里 更新时间:2023-11-01 01:07:00 24 4
gpt4 key购买 nike

这可能是一个晦涩的问题,但我在网上看到很多非常酷的示例,说明人们如何使用 ARKit 3 中新的 ARKit 人物遮挡技术有效地将人物与背景“分开”,并应用某种过滤给“人民”(见 here )。

在查看 Apple 提供的源代码和文档时,我发现我可以从 ARFrame 中检索 segmentationBuffer,我已经这样做了,就像这样;

func session(_ session: ARSession, didUpdate frame: ARFrame) {
let image = frame.capturedImage
if let segementationBuffer = frame.segmentationBuffer {

// Get the segmentation's width
let segmentedWidth = CVPixelBufferGetWidth(segementationBuffer)

// Create the mask from that pixel buffer.
let sementationMaskImage = CIImage(cvPixelBuffer: segementationBuffer, options: [:])

// Smooth edges to create an alpha matte, then upscale it to the RGB resolution.
let alphaUpscaleFactor = Float(CVPixelBufferGetWidth(image)) / Float(segmentedWidth)
let alphaMatte = sementationMaskImage.clampedToExtent()
.applyingFilter("CIGaussianBlur", parameters: ["inputRadius": 2.0)
.cropped(to: sementationMaskImage.extent)
.applyingFilter("CIBicubicScaleTransform", parameters: ["inputScale": alphaUpscaleFactor])

// Unknown...

}
}

在“未知”部分,我正在尝试确定如何在原始相机画面之上渲染我的新“模糊”人物。似乎没有任何方法可以在原始相机源的“顶部”绘制新的 CIImage,因为 ARView 无法手动更新。

最佳答案

在下面的代码片段中,我们看到用于深度合成的 personSegmentationWithDepth 类型属性(有 RGB、Alpha 和深度 channel ):

// Automatically segmenting and then compositing foreground (people), 
// middle-ground (3D model) and background.

let session = ARSession()

if let configuration = session.configuration as? ARWorldTrackingConfiguration {
configuration.frameSemantics.insert(.personSegmentationWithDepth)
session.run(configuration)
}

您可以在 CVPixelBuffer 中手动访问世界跟踪的深度数据(执行分割的深度值):

let image = frame.estimatedDepthData

并且您可以在 CVPixelBuffer 中手动访问面部跟踪的深度数据(来自 TrueDepth 相机):

let image = session.currentFrame?.capturedDepthData?.depthDataMap

此外,ARKit 3.0 中还有一个generateDilatedDepth 实例方法:

func generateDilatedDepth(from frame: ARFrame, 
commandBuffer: MTLCommandBuffer) -> MTLTexture

在您的情况下,您必须使用 estimatedDepthData 因为 Apple 文档说:

It's a buffer that represents the estimated depth values from the camera feed that you use to occlude virtual content.

var estimatedDepthData: CVPixelBuffer? { get }

如果您使用 compositing techniques 将此缓冲区中的 DEPTH 数据(首先您必须将深度 channel 转换为 RGB)乘以 RGBALPHA你会得到很棒的效果。

看看这 6 张图像:下一行代表三个使用深度 channel 校正的 RGB 图像:深度分级、深度模糊、深度点位置传递。

enter image description here

关于swift - ARKit People Occlusion 样本是如何完成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57121557/

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