首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Swift 4在ARKit中实现实时摄像头过滤器?

如何用Swift 4在ARKit中实现实时摄像头过滤器?
EN

Stack Overflow用户
提问于 2019-10-21 09:46:10
回答 1查看 684关注 0票数 2

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

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

代码语言:javascript
复制
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) }

我有黑白相机过滤器使用上述代码。

代码语言:javascript
复制
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摄像头过滤器的代码,那就太好了。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-03-12 03:01:39

代码语言:javascript
复制
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

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58483705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档