Ookay, i fiddled with guassian blur and tried to replace color within range of a background picture rgb, but it doesn't remove the background completely unless i use a very high range (like 0.5), and since the rgb values are between 0.0 and 1.0 the range is really too large. Could someone please shed some light on this? What i might be doing wrong, any other technique i could try etc. This is how i've done it so far:

kernel vec4 backgroundMasker(sampler image_orig, sampler image_denoised, sampler mask_image_denoised, sampler background_image)
{
        vec4 pixel_camera = sample(image_orig, samplerCoord(image_orig));
vec4 pixel_camera_denoised = sample(image_denoised, samplerCoord(image_denoised)); vec4 pixel_mask_denoised = sample(mask_image_denoised, samplerCoord(mask_image_denoised)); vec4 pixel_background = sample(background_image, samplerCoord(background_image));
        
        float difference = 0.01;
        
float value_mask_r_max = (pixel_mask_denoised.r > 1.0-difference) ? 1.0 : pixel_mask_denoised.r+difference; float value_mask_g_max = (pixel_mask_denoised.g > 1.0-difference) ? 1.0 : pixel_mask_denoised.g+difference; float value_mask_b_max = (pixel_mask_denoised.b > 1.0-difference) ? 1.0 : pixel_mask_denoised.b+difference;
        
float value_mask_r_min = (pixel_mask_denoised.r < 0.0+difference) ? 0.0 : pixel_mask_denoised.r-difference; float value_mask_g_min = (pixel_mask_denoised.g < 0.0+difference) ? 0.0 : pixel_mask_denoised.g-difference; float value_mask_b_min = (pixel_mask_denoised.b < 0.0+difference) ? 0.0 : pixel_mask_denoised.b-difference;
        
        vec4 pixel_to_return;

pixel_to_return = pixel_camera_denoised.r < value_mask_r_max ? pixel_background : pixel_camera; pixel_to_return = pixel_camera_denoised.r > value_mask_r_min ? pixel_background : pixel_camera;
        
pixel_to_return = pixel_camera_denoised.g < value_mask_g_max ? pixel_background : pixel_camera; pixel_to_return = pixel_camera_denoised.g > value_mask_g_min ? pixel_background : pixel_camera;
        
pixel_to_return = pixel_camera_denoised.b < value_mask_b_max ? pixel_background : pixel_camera; pixel_to_return = pixel_camera_denoised.b > value_mask_b_min ? pixel_background : pixel_camera;
                
        return pixel_to_return;
}



20 jan 2009 kl. 10.55 skrev Jonathan Selander:

I've tried implementing the background keying thing now like this:


kernel vec4 backgroundMasker(sampler image, sampler background_image, sampler mask_image, __color key_color)
{
        vec4 pixel_camera = sample(image, samplerCoord(image));
        vec4 pixel_mask = sample(mask_image, samplerCoord(mask_image));
vec4 pixel_background = sample(background_image, samplerCoord(background_image));
        
        vec4 pixel_to_return = (pixel_mask.r > pixel_camera.r)
                ? pixel_background : pixel_camera;
        pixel_to_return = (pixel_mask.r-pixel_camera.g > 0.4)
                ? pixel_background : pixel_camera;
        pixel_to_return = (pixel_mask.r-pixel_camera.b > 0.4)
                ? pixel_background : pixel_camera;
                
        return pixel_to_return;
}


I have no idea if i'm on the right track or not, so any kind of help or pointer in the right direction would be much appreciated.

I have a bunch of red things here which i try the filter against, that's why i check the red component. Right now it replaces some areas with the background image, but not the red ones.

Thanks


19 jan 2009 kl. 10.02 skrev Jonathan Selander:

Thanks for a great reply!

The setup uses an imac with its built-in camera, and the green screen is completely light green and very higly lit to prevent any shadow. I guess the motion detection method doesn't really work with this type of camera, so i'm looking at the method that simply masks out the background somehow. Today i've tried making it work with javascript/core image filter patches, but i'm still a bit new at that. You wouldn't happen to have an old patch lying around that uses either of these techniques? :-)

Jonathan

16 jan 2009 kl. 14.03 skrev Chris Wood:

Jonathan,

There's 2 ways I've used to do it. The first is to use a filter to remove the background (you would need to have the camera pointing at a plain coloured background though) and in the filter just compare to see if the green component is much higher than the other components, and filter on that. Noise is still an issue, but it can at least be reduced a bit.

The other way is to do motion detection, and remove anything not moving. To do that I just used a queue with a length of 2, so I could feed the current and last frames into a filter. It's fairly easy to mask out the background, but there are some quite nasty catches.

Video noise is a huge problem, as it means the whole image is always moving slightly. You really need a good camera to get rid of it, otherwise you have to do a lot of noise reduction that can make the image look blurry.

Another big problem is auto-white balance on the camera, or anything like that.. if the camera suddenly adjusts anything, the whole image changes so the background suddenly pops into view for a short time. Again, a good camera with manual controls would help.

The last problem is that sometimes the thing you want to show stops moving. Say you're filming somebody talking.. their mouth is moving, but their eyes might stay still for a short time. They disappear.. and even if they are moving constantly, sometimes there will be an area with similar colour that doesn't get detected, and you have a hole..

I guess the way ichat works is to sample the background just once, when there is nothing in front of it, and use that for comparison. Then even if you're still, there is still a difference. You still have the problem of white balance changes, video noise etc., though so you'll need a fair bit of cleaning done on the image.

Chris



2009/1/16 Jonathan Selander <[email protected]>
Hi,

I've used a couple of patches from the QCTV example application to create a green screen effect in my composition. However, i just compared it to Photo Booth which does it much more accurately. What's the best way to accomplish this? Is there any patch out there i can use that works well?

The QCTV patch seems to be very susceptible to video noise, so lots of pixels appear everywhere, so the backdrop isn't solid.

Thanks
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list ([email protected] )
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/psonice%40gmail.com

This email sent to [email protected]


_______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list ([email protected] )
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/jonathan%40trodon.se

This email sent to [email protected]

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list ([email protected] )
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/jonathan%40trodon.se

This email sent to [email protected]

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to