使用 CIFilter 渲染时,实时摄像头被拉伸。- 斯威夫特 4

Ana*_*aty 5 camera stretched ios cifilter arkit

我想在渲染时应用相机滤镜,我的代码是...

func session(_ session: ARSession, didUpdate frame: ARFrame) {
let image = CIImage(cvPixelBuffer: frame.capturedImage)
        var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0

        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        filter.setDefaults()
        filter.setValue(image, forKey: kCIInputImageKey)
        filter.setValue(CIVector(x: r, y: 0, z: 0, w: 0), forKey: "inputRVector")
        filter.setValue(CIVector(x: 0, y: g, z: 0, w: 0), forKey: "inputGVector")
        filter.setValue(CIVector(x: 0, y: 0, z: b, w: 0), forKey: "inputBVector")
        filter.setValue(CIVector(x: 0, y: 0, z: 0, w: a), forKey: "inputAVector")

        if let result = filter.outputImage,
            let cgImage = context.createCGImage(result, from: result.extent) {
            sceneView.scene.background.contents = cgImage
            sceneView.scene.background.contentsTransform = SCNMatrix4MakeRotation(.pi / 2, 0, 0, 1)
        }
}
Run Code Online (Sandbox Code Playgroud)

在运行时,输出被拉伸。我附上了两张图片,

  1. 普通相机渲染
  2. 带滤镜相机渲染。

这是普通的相机渲染,看起来不错,

这是带滤镜的实时摄像头,您可以在运行时看到实时摄像头被拉伸。

请帮我解决它,如果您提供任何演示代码或项目,那将是非常有帮助的。谢谢你。

Jua*_*ero 1

首先,我建议您复制一份ARFrame,否则currentFrame如果不尽快处理,将会出现各种奇怪的情况,因为内存将被硬件丢弃。

其次,拉伸是因为您使用的缓冲区图像与视口图像不同,抓取一个session.snapshot并将其保存到您的mac上,然后抓取cgImage并保存它,在预览中打开它们,您会看到尺寸不同,因此,当您想要将更宽的图像放回视口大小时,它会拉伸。

您不需要这个演示项目,只需打印场景帧大小和缓冲区大小,检查两者之间的比率,您就会明白您的问题。