这可能是一个晦涩的问题,但我在网上看到很多人使用ARKit 3中的新技术——人体遮挡技术,有效地将人与背景“分离”,并对“人”应用某种过滤器以展示非常酷炫的样例(请参见此处)。
通过查看苹果提供的源代码和文档,我发现我可以从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没有手动更新的方式。
CISourceOverCompositing
(它使用公式-Argb * Aa + Brgb *(1-Aa),其中A表示前景,B表示背景)。关于更新视图,我无法发表任何意见,因为我目前无法安装iOS13,所以无法测试任何方法。 - Andy JazzArgb*Aa
是预乘的 RGBA 图像,而(1-Aa)
则是前景图像 alpha 值的反转(alpha 反转会在背景图像中形成一个孔洞,使您可以将一个预乘的前景图像放置到这个孔洞中)。 - Andy JazzCISourceOverCompositing
也很有用,我觉得这是缺失部分的50%。现在,我必须弄清楚如何将组合图像实际显示在屏幕上,因为我仍然缺乏将组合的CIImage(或CVPixelBuffer)放置在ARFrame之上的知识。 - ZbadhabitZ