Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用Swift 4在ARKit中实现实时摄像机过滤器?_Ios_Camera_Swift4_Arkit_Cifilter - Fatal编程技术网

Ios 如何使用Swift 4在ARKit中实现实时摄像机过滤器?

Ios 如何使用Swift 4在ARKit中实现实时摄像机过滤器?,ios,camera,swift4,arkit,cifilter,Ios,Camera,Swift4,Arkit,Cifilter,我想在我的项目中集成iPhone摄像头过滤器,我的项目基于ARKit,我想应用苹果在摄像头应用程序中提供的各种过滤器,特别是生动、生动、温暖和生动、凉爽 我已经尝试了我在下面提到的各种可能性 func session(_ session: ARSession, didUpdate frame: ARFrame) { guard let currentBackgroundFrameImage = sceneView.session.currentFrame?.capturedIma

我想在我的项目中集成iPhone摄像头过滤器,我的项目基于ARKit,我想应用苹果在摄像头应用程序中提供的各种过滤器,特别是生动、生动、温暖和生动、凉爽

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

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
。这是一件非常昂贵的物品。尝试在初始化期间创建它,并在每一帧重复使用它。
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

}