I am using the GPUImage library and I'm trying to blend two images in realtime, and display them on a
GPUImageView. I am trying to alpha-blend plain camera input, with a filtered version of it. Here is what I'm trying to do:
----------------->----v --camera--| alpha blend ----> image view -----> color filter --^
I've found some posts about using the blend filters, but they don't seem to be methods for realtime processing. I've found https://github.com/BradLarson/GPUImage/issues/319, GPUImage: mezcla de dos imágenes y https://github.com/BradLarson/GPUImage/issues/751 (but they either aren't for realtime processing, (first and the second), or doesn't work (third one).
I've tried almost everything, but all I'm getting is a white image in the GPUImageView. If I don't use the alpha blend filter, say, just use a false color filter or something similar, it works perfectly. Here is my code:
blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; blendFilter.mix = 0.5; [blendFilter prepareForImageCapture]; [blendFilter addTarget:imageView]; passThrough = [[GPUImageFilter alloc] init]; [passThrough prepareForImageCapture]; [passThrough addTarget:blendFilter]; selectedFilter = [[GPUImageFalseColorFilter alloc] init]; [selectedFilter prepareForImageCapture]; [selectedFilter addTarget:blendFilter]; stillCamera = [[GPUImageStillCamera alloc] init]; stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait; [stillCamera addTarget:passThrough]; [stillCamera addTarget:selectedFilter]; [stillCamera startCameraCapture];
All I'm getting is a white, blank screen. If I change
[selectedFilter addTarget:blendFilter]; a
[selectedFilter addTarget:imageView]; then false color filter gets displayed on the image.
There seems to be something wrong with the alpha blend filter. I've read that in some posts that I need to call
processImage on the inputs, but those posts are all for non-realtime inputs as far as I understand. How can I get GPUImageAlphaBlendFilter to work in realtime?
preguntado el 05 de mayo de 13 a las 14:05
Ok, after investigating the issue further over the internet and on project's issue list (https://github.com/BradLarson/GPUImage/issues) and found a workaround. While setting the blend filter as the target, I needed to specify the texture index specifically. For some reason (probably a bug), adding the target blend filter two times doesn't add the second texture correctly at the next index. So setting the texture indices explicitly as 0 and 1 did work:
[passThrough addTarget:blendFilter atTextureLocation:0]; [selectedFilter addTarget:blendFilter atTextureLocation:1];
For the filters that are targets of single sources,
addTarget: is enough though such as