Using MPSImageGaussianBlur with depth data

I am trying to create a simulation of portrait mode in my own camera Apple.

The problem is that applying the blur effect using CIImage with respect to depth data is too slow for a real-time preview that I want to show to the user.

My code for this is the mission:

func blur(image: CIImage, mask: CIImage, orientation: UIImageOrientation = .up, blurRadius: CGFloat) -> UIImage? {
    let start = Date()
    let invertedMask = mask.applyingFilter("CIColorInvert")

    let output = image.applyingFilter("CIMaskedVariableBlur", withInputParameters: ["inputMask" : invertedMask,
                                                                                    "inputRadius": blurRadius])

    guard let cgImage = context.createCGImage(output, from: image.extent) else {
        return nil
    }
    let end = Date()
    let elapsed = end.timeIntervalSince1970 - start.timeIntervalSince1970
    print("took \(elapsed) seconds to apply blur")
    return UIImage(cgImage: cgImage, scale: 1.0, orientation: orientation)
}

I want to apply blur on a GPU for better performance. For this task, I found this implementation provided by Apple here.

So, in the Apple implementation, we have this piece of code:

/** Applies a Gaussian blur with a sigma value of 0.5.
 This is a pre-packaged convolution filter.
 */
class GaussianBlur: CommandBufferEncodable {
    let gaussian: MPSImageGaussianBlur

    required init(device: MTLDevice) {
        gaussian = MPSImageGaussianBlur(device: device,
                                    sigma: 5.0)
    }

    func encode(to commandBuffer: MTLCommandBuffer, sourceTexture: MTLTexture, destinationTexture: MTLTexture) {
        gaussian.encode(commandBuffer: commandBuffer,
                    sourceTexture: sourceTexture,
                    destinationTexture: destinationTexture)
    }
}

My question is: How can I apply depth data to filtering through the metal blur version? Or, in other words, how can I get the first functionality of code fragments with the speed of execution of the second code fragment?

+4

Source: https://habr.com/ru/post/1695353/


All Articles