I'm trying to apply a blur effect to camera live steam image in ARSCNView. I have checked the WWDC videos. They only mentioned the custom rendering with Metal, but I didn't found any complete example on web. Any idea how to do that?
Updated 1 I have tried to apply a filter to the background. It show incorrect orientation. How can I fix this?
let bg=self.session.currentFrame?.capturedImage
if(bg != nil){
let context = CIContext()
let filter:CIFilter=CIFilter(name:"CIColorInvert")!
let image:CIImage=CIImage(cvPixelBuffer: bg!)
filter.setValue(image, forKey: kCIInputImageKey)
let result=filter.outputImage!
self.sceneView.scene.background.contents = context.createCGImage(result, from: result.extent)
}
I've found a pretty good solution, which is to simply apply a corresponding geometric transform to the background
property whenever the device orientation changes:
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let image = CIImage(cvPixelBuffer: frame.capturedImage)
filter.setValue(image, forKey: kCIInputImageKey)
let context = CIContext()
if let result = filter.outputImage,
let cgImage = context.createCGImage(result, from: result.extent) {
sceneView.scene.background.contents = cgImage
if let transform = currentScreenTransform() {
sceneView.scene.background.contentsTransform = transform
}
}
}
private func currentScreenTransform() -> SCNMatrix4? {
switch UIDevice.current.orientation {
case .landscapeLeft:
return SCNMatrix4Identity
case .landscapeRight:
return SCNMatrix4MakeRotation(.pi, 0, 0, 1)
case .portrait:
return SCNMatrix4MakeRotation(.pi / 2, 0, 0, 1)
case .portraitUpsideDown:
return SCNMatrix4MakeRotation(-.pi / 2, 0, 0, 1)
default:
return nil
}
}
Make sure you call UIDevice.current.beginGeneratingDeviceOrientationNotifications()
in your viewDidLoad
method first.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With