ios - 使用 CIFilter 进行渲染时,实时摄像机被拉伸(stretch)。 - swift 4

标签 ios camera arkit cifilter stretched

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

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)
        }
}

在运行时,输出会被拉伸(stretch)。我附上了两张图片,
  • 普通相机渲染
  • 带滤镜相机渲染。

  • This is normal camera rendering, it looks nice,

    This is live camera with filter, you can see at runtime Live camera is getting stretched.

    请帮我解决它,如果您提供任何演示代码或项目将有很大帮助。谢谢你。

    最佳答案

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

    二、拉伸(stretch)是因为你使用的缓冲图像和视口(viewport)图像不同,抓一个session.snapshot并将其保存到您的 mac,然后获取您的 cgImage并保存它,在预览中打开它们,你会看到大小不同,所以,当你想把更宽的图像放回视口(viewport)大小时,它会拉伸(stretch)。

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

    关于ios - 使用 CIFilter 进行渲染时,实时摄像机被拉伸(stretch)。 - swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58501761/

    相关文章:

    iphone - 添加testflight sdk后无法构建项目

    android - 拍照卡在 Android 2.3.3 上

    ios - 使用 Project_Prefix.pch 导入我的单例类 - 不好的做法?

    objective-c - UIStatusBarAnimationFade 持续时间

    android - Cordova 相机,无法拍摄刚拍摄的照片

    android - 按下按钮拍摄并保存照片

    ios - ARSession 运行但没有配置

    ios - SceneKit:围绕自身旋转节点

    swift - displayTransform 调用后图像方向错误

    ios - 在 UIScrollView 中设置大图像