ios - 如何使用 Swift 4 在 ARKit 中实现实时相机滤镜?
问题描述
我想在我的项目中集成 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 相机滤镜的代码,那就太好了。谢谢你。
解决方案
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
}
推荐阅读
- c# - 动态创建的 Word 文档中缺少打开的 XML 部分
- ios - 如何在 TestFlight 中拥有多个版本的应用程序?
- java - 为什么在一个示例中需要 throws 关键字,而在另一个示例中不需要?
- reactjs - React TypeScript:如何使用变量名作为键的一部分
- git - 有没有办法将分支重置为 master 但保留提交历史记录?
- python - 列表元素的公平划分
- sql-server-2017 - SQL 作业未运行。错误:无法获取有关 Windows NT 组/用户“域\用户名”的信息,错误代码 0x2
- database-design - 在数据库中存储选择冲突/需求的良好架构是什么?
- javascript - 响应标头为空
- python - 如何附加到现有的 csv 字典或使用 python csv 添加行?