Swift 阿基特人是如何做的?

Swift 阿基特人是如何做的?,swift,scenekit,augmented-reality,arkit,realitykit,Swift,Scenekit,Augmented Reality,Arkit,Realitykit,这可能是一个模糊的问题,但我在网上看到很多非常酷的例子,说明人们如何在ARKit 3中使用新的ARKit people occlusion技术来有效地“分离”背景中的人,并对“人”应用某种过滤(请参阅) 通过查看苹果提供的源代码和文档,我发现我可以从ARFrame中检索segmentationBuffer,就像这样 func session(_ session: ARSession, didUpdate frame: ARFrame) { let image = frame.captur

这可能是一个模糊的问题,但我在网上看到很多非常酷的例子,说明人们如何在ARKit 3中使用新的ARKit people occlusion技术来有效地“分离”背景中的人,并对“人”应用某种过滤(请参阅)

通过查看苹果提供的源代码和文档,我发现我可以从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和深度通道):

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

您可以在CVPixelBuffer中手动访问人脸跟踪的深度数据(从TrueDepth camera):

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

func generateDilatedDepth(from frame: ARFrame, 
                       commandBuffer: MTLCommandBuffer) -> MTLTexture
在您的情况下,您必须使用
EstimatedepthData
,因为苹果的文档说明:

它是一个缓冲区,表示用于阻挡虚拟内容的摄影机提要的估计深度值

如果您使用
RGB
ALPHA
将此缓冲区中的
DEPTH
数据相乘(首先必须将深度通道转换为RGB),您将获得非常棒的效果

请看这6幅图像:下一行表示使用深度通道校正的三幅RGB图像:深度分级、深度模糊、深度点位置传递


WWDC会议有一些信息,特别是关于。本次会议还附带了一个.

感谢您的回复,@ARGeo。然而,这并没有解释如何使用segmentationBuffer/深度数据映射。如果我想通过CIFilter运行分段的人,然后在屏幕上呈现,我不确定如何实现问题中链接的示例视频所实现的目标。我将在3-4小时内尝试回答更多细节。这非常非常有用,@ARGeo。实际上,我不知道如何将估计的深度数据与分段缓冲区结合使用,这确实澄清了这两种方法的目的。尽管如此,假设我成功地将深度数据转换为RGB,我仍然不清楚如何将过滤后的缓冲区“叠加”到视图顶部。在ARSession中,ARView由iOS预配置,似乎没有任何方法手动更新视图;从某种意义上说,我得到的缓冲时间之间的相机似乎他们和他们的渲染;如何渲染?对于叠加,使用a
cisourceovercomposition
(它使用一个公式–
Argb*Aa+Brgb*(1-Aa)
,a=前景,B=背景)。谈到更新视图,我什么也说不出来,因为目前我无法安装iOS13,所以我无法测试任何方法。感谢您提供的所有详细信息,@ARGeo。您的解释确实有助于理解各种通道在做什么,以及如何正确计算它们。谢谢你!
cisourceovercomposition
也很有帮助,我觉得这是缺失部分的50%。现在我必须弄清楚如何拍摄合成图像并将其显示在屏幕上,因为我仍然不知道如何将合成图像(或CVPixelBuffer)显示在ARFrame的顶部。谢谢,@mnuages。我确实看过那个会话,以及您链接到的示例代码,尽管我不太确定如何将所有这些放在一起。该项目中的示例代码引用了为ARSession构建自己的渲染器,需要金属绘制分段的人物和摄影机提要。有没有一种方法可以在不使用自定义渲染器的情况下实现同样的效果,只需使用segmentationBuffer和EstimatedEdeptHdata并修改ARView?而不是建立自己的MTKView?^这正是我的问题。这方面有什么更新吗?还想知道这个问题是否有答案,例如,使用ARFrame作为遮挡/渲染系统的输入。
let image = frame.estimatedDepthData
let image = session.currentFrame?.capturedDepthData?.depthDataMap
func generateDilatedDepth(from frame: ARFrame, 
                       commandBuffer: MTLCommandBuffer) -> MTLTexture
var estimatedDepthData: CVPixelBuffer? { get }