Background Subtraction

View: New views
2 Messages — Rating Filter:   Alert me  

Background Subtraction

by jai-interest-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I'm new to JAI and am trying to implement a simple background subtraction algorithm for motion detection in a video stream.

I have a relatively fast (< 30ms/iteration) algorithm written using awt images:
                                byte[] baseGreyPx = (byte[]) baseGreyImg.getRaster().getDataElements(0, 0, w, h, null );
                                byte[] greyPx = (byte[]) greyImg.getRaster().getDataElements(0, 0, w, h, null );
                                byte[] outPx = new byte[baseGreyPx.length];

                                for (int i=0; i<baseGreyPx.length; i++){
                                        if (Math.abs(greyPx[i]-baseGreyPx[i]) < ((byte)((threshold << 24) >> 24 ))){
                                                outPx[i] = Byte.MIN_VALUE;
                                        } else {
                                                outPx[i] = Byte.MAX_VALUE;
                                        }
                                }

                                diff = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
                                diff.getRaster().setDataElements(0, 0, w, h, outPx);

The algorithm above accepts two BufferedImages of TYPE_BYTE_GREY and outputs a one bit image, diff.

I'm hoping to duplicate this functionality using JAI, but I'm getting poor results and am hoping for some advice. Here is my current code:
                                RenderableImage grey = getRenderableFromBufferedImage(greyImg);
                                RenderableImage base = getRenderableFromBufferedImage(baseGreyImg);
                           
                                ParameterBlock pb = new ParameterBlock();
                               
                                pb.addSource(grey);
                                pb.addSource(base);
                                RenderableImage sub = JAI.createRenderable("subtract", pb);
                               
                                pb = new ParameterBlock();
                                pb.addSource(sub);
                                RenderableImage abs = JAI.createRenderable("absolute", pb);
                               
                                pb = new ParameterBlock();
                                pb.addSource(abs);
                                pb.add((double)threshold);
                                RenderableImage thresh = JAI.createRenderable("binarize", pb);
                               
                                diff = ((PlanarImage)thresh.createDefaultRendering()).getAsBufferedImage();
[Message sent by forum member 'kngpengwin' (kngpengwin)]

http://forums.java.net/jive/thread.jspa?messageID=356865

---------------------------------------------------------------------
To unsubscribe, e-mail: interest-unsubscribe@...
For additional commands, e-mail: interest-help@...


Re: Background Subtraction

by jai-interest-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Try this

Let say u have 2 image..... which is img1 and img2..
first call the function img 3 = subtractImage(img1 , img2 )  then swap the parameter place img4 = subtractImage(img2, img1) now add both the images.

private BufferedImage subtractImage(BufferedImage img1, BufferedImage img2) {

                BufferedImage imageOut;
                RenderedOp op = SubtractDescriptor.create(img1, img2, null);
                imageOut = op.getAsBufferedImage();
                return imageOut;
}
[Message sent by forum member 'servantprint' (shadow_prinz@...)]

http://forums.java.net/jive/thread.jspa?messageID=370699

---------------------------------------------------------------------
To unsubscribe, e-mail: interest-unsubscribe@...
For additional commands, e-mail: interest-help@...