我想在渲染时应用相机滤镜,我的代码是...
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)
}
}
在运行时,输出被拉伸。我已附上两张图片,
请帮助我解决它,如果您提供任何演示代码或项目,将对您有很大的帮助。谢谢。
最佳答案
首先,我建议您复制ARFrame
,否则,如果不尽快处理,currentFrame
会出现各种怪异现象,因为内存将被硬件丢弃。
其次,拉伸是因为您使用的是与视口图像不同的缓冲图像,请抓取session.snapshot
并将其保存到您的mac,然后再抓取cgImage
并也将其保存,在“预览”中打开它们,您将看到大小不同,因此,当您要将较宽的图像放回视口大小时,它会拉伸。
您不需要为此做一个演示项目,只需打印您的场景帧大小和缓冲区大小,检查两者之间的比率,您将了解您的问题。