Search code examples
iosswiftgpuimage

GPUImage Greyscale live camera feed with overlaid animated static


I'm trying to have the live camera feed displayed as greyscale with animated static overlaid.

I have the greyscale working, that was easy, but I'm having trouble figuring out out to overlay an image as well (let alone have that be animated).

Any help/letting me know that having the overlay animated is a no go is appreciated ? Thanks.

greyscale code:

private var videoCamera: GPUImageVideoCamera?
private var videoView: GPUImageView?
private var greyscaleFilter: GPUImageGrayscaleFilter?

videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset352x288, cameraPosition: .Back)

videoView = GPUImageView(frame: CGRect(x: 0, y: 0, width: 352, height: 288))
view.addSubview(videoView!)

greyscaleFilter = GPUImageGrayscaleFilter()
greyscaleFilter?.addTarget(videoView)

videoCamera?.addTarget(greyscaleFilter);
videoCamera?.startCameraCapture()

EDIT: This is where I'm currently at, I'm using the examples provided with GPUImage but can't see why it's not working yet. (overlay.jpg is the image I am using to test thinking the blend will be more obvious with it instead of the subtle static I really need). this code results in just greyscale video, the blend filter doesn't seem to be doing anything at all.

videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset352x288, cameraPosition: .Back)

videoView = GPUImageView(frame: CGRect(x: 0, y: 0, width: 352, height: 288))
view.addSubview(videoView!)

greyscaleFilter = GPUImageGrayscaleFilter()
videoCamera?.addTarget(greyscaleFilter)
greyscaleFilter?.addTarget(videoView)

blendFilter = GPUImageOverlayBlendFilter()
videoCamera?.addTarget(blendFilter)
inputImage = ImageCache.loadImage(named: "overlay.jpg")
blendImage? = GPUImagePicture(image: inputImage)
blendImage?.addTarget(blendFilter)
blendImage?.processImage()
blendFilter?.addTarget(videoView)

videoCamera?.startCameraCapture()

Solution

  • Finally back to this and I got it working, not exactly sure why it wasn't before, but; I changed a few of the types to not be optional, and therefore had to initialize them in init(coder aDecoder: NSCoder) method of my ViewController, after doing that it works great.

    Updated code below.

    var videoCamera: GPUImageVideoCamera
    var videoView: GPUImageView
    var greyscaleFilter: GPUImageGrayscaleFilter
    var blendFilter: GPUImageOverlayBlendFilter
    var blendImage: GPUImagePicture?
    var inputImage: UIImage?
    
    required init(coder aDecoder: NSCoder) {
        videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraPosition: .Back)
        videoView = GPUImageView(frame: CGRect(x: 0, y: 0, width: 640, height: 480))
    
        blendFilter = GPUImageOverlayBlendFilter()
        greyscaleFilter = GPUImageGrayscaleFilter()
    
        super.init(coder: aDecoder)
    }
    
    override func viewDidLoad() {
        view.addSubview(videoView)
    
        videoCamera.addTarget(greyscaleFilter)
    
        greyscaleFilter.addTarget(blendFilter)
    
        let inputImage = ImageCache.loadImage(named: "overlay.jpg")
        self.blendImage = GPUImagePicture(image: inputImage)
        self.blendImage?.addTarget(blendFilter)
        self.blendImage?.processImage()
        blendFilter.addTarget(videoView)
    
        videoCamera.startCameraCapture()
    
        super.viewDidLoad()
    }