/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.freedomotic.plugins.devices.webcam; import java.awt.Image; import java.awt.image.ImageObserver; import java.awt.image.PixelGrabber; /** * * @author Enrico Nicoletti */ public class SimpleMotionDetector extends MotionDetector { int oldSum; private int[] previousPixels = null; private int[] latestPixels = null; private int motionLevel; int frameNo = 0; public SimpleMotionDetector() { super(); } public int enqueueImage(Image latest) { int w = latest.getWidth(null); int h = latest.getHeight(null); //First time we run this function allocate the array if (latestPixels == null) { latestPixels = new int[w * h]; } if (previousPixels == null) { previousPixels = new int[w * h]; } PixelGrabber latestPixelGrabber = new PixelGrabber(latest, 0, 0, w, h, latestPixels, 0, w); try { latestPixelGrabber.grabPixels(); } catch (InterruptedException e) { System.out.println("interrupted waiting for pixels"); } if ((latestPixelGrabber.getStatus() & ImageObserver.ABORT) != 0) { System.out.println("image fetch aborted or errored"); } if (previousPixels != null) { motionLevel = 0; for (int ct = 0; ct < (w * h); ct++) { int latestPixel = latestPixels[ct]; int latestAlpha = (latestPixel >> 24) & 0xff; int latestRed = (latestPixel >> 16) & 0xff; int latestGreen = (latestPixel >> 8) & 0xff; int latestBlue = (latestPixel) & 0xff; int previousPixel = previousPixels[ct]; int previousAlpha = (previousPixel >> 24) & 0xff; int previousRed = (previousPixel >> 16) & 0xff; int previousGreen = (previousPixel >> 8) & 0xff; int previousBlue = (previousPixel) & 0xff; if ((Math.abs(previousRed - latestRed) > noiseThreshold) | (Math.abs(previousGreen - latestGreen) > noiseThreshold) | (Math.abs(previousBlue - latestBlue) > noiseThreshold)) { motionLevel++; } } } System.arraycopy(latestPixels, 0, previousPixels, 0, latestPixels.length); try { Thread.sleep(100); } catch (InterruptedException e) { } //Normalise motion level to be in the range 0-999 int noOfPixels = w * h; motionLevel = (motionLevel * 1000) / noOfPixels; //return no motion for first few frames to avoid initial motion spike if (frameNo < 5) { frameNo++; return 0; } return motionLevel; } }