【问题标题】:How to implement Live camera filter in ARKit with Swift 4?如何使用 Swift 4 在 ARKit 中实现实时相机滤镜?
【发布时间】:2020-02-17 09:21:43
【问题描述】:

我想在我的项目中集成 iPhone 相机滤镜,我的项目是基于 ARKit 的,我想应用苹果在相机应用程序中提供的各种滤镜,特别是 VIVID、VIVID WARM 和 VIVID COOL,

我已经尝试了我在下面提到的各种可能性。

func session(_ session: ARSession, didUpdate frame: ARFrame) {
        guard let currentBackgroundFrameImage = sceneView.session.currentFrame?.capturedImage,
        let pixelBufferAddressOfPlane = CVPixelBufferGetBaseAddressOfPlane(currentBackgroundFrameImage, 1) else { return }

       let x: size_t = CVPixelBufferGetWidthOfPlane(currentBackgroundFrameImage, 1)
       let y: size_t = CVPixelBufferGetHeightOfPlane(currentBackgroundFrameImage, 1)
       memset(pixelBufferAddressOfPlane, 128, Int(x * y) * 2) }

我使用上面的代码得到了黑白相机滤镜。

func session(_ session: ARSession, didUpdate frame: ARFrame) {
        let bg = session.currentFrame?.capturedImage
        if (bg != nil) {
            let image = CIImage(cvPixelBuffer: bg!)
            let filter:CIFilter = CIFilter(name: "CIPixellate")!
            filter.setDefaults()
            filter.setValue(image, forKey: kCIInputImageKey)
            //let filteredImageData = filter.value(forKey: kCIOutputImageKey) as! CIImage

            let context = CIContext()
            //if let result = filter.outputImage,
            if let result = filter.value(forKey: kCIOutputImageKey) ,
                let cgImage = context.createCGImage(result as! CIImage, from: (result as! CIImage).extent) {
                let imageForUser = UIImage(cgImage: cgImage)
                sceneView.scene.background.contents = imageForUser
                sceneView.scene.background.contentsTransform = SCNMatrix4MakeRotation(.pi / 2, 0, 0, 1)
            }
        }
}

使用上述代码,相机卡住并且渲染速度非常慢,有时应用程序由于内存问题而崩溃。 (在 iPhone XR 中测试)

请帮助我获得实时相机滤镜功能。如果你能提供任何 ARKit 相机滤镜的代码,那就太好了。谢谢你。

【问题讨论】:

  • 对于初学者,不要每帧创建一个新的CIContext。这是一个非常昂贵的对象。尝试在初始化期间创建它并在每一帧重复使用它。

标签: ios camera swift4 arkit cifilter


【解决方案1】:
func session(_ session: ARSession, didUpdate frame: ARFrame) {

   let image = CIImage(cvPixelBuffer: frame.capturedImage)
   let filter = CIFilter(name: "CIPixellate")!
   filter.setValue(image, forKey: kCIInputImageKey)
   let result = filter.outputImage!
   sceneView.scene.background.contents = context.createCGImage(result, from: image.extent)
   sceneView.scene.background.contentsTransform = SCNMatrix4MakeRotation(.pi / 2, 0, 0, 1) // fixes orientation

}

【讨论】:

    猜你喜欢
    • 2016-10-14
    • 2018-04-10
    • 2018-11-14
    • 2016-01-06
    • 1970-01-01
    • 2018-06-15
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多