example
Example
// Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com

// Example 16-13: Simple motion detection

import processing.video.*;
// Variable for capture device
Capture video;
// Previous Frame
PImage prevFrame;
// How different must a pixel be to be a "motion" pixel
float threshold = 50;

void setup() {
  size(320,240);
  video = new Capture(this, width, height, 30);
  // Create an empty image the same size as the video
  prevFrame = createImage(video.width,video.height,RGB);
}

void draw() {
  
  // Capture video
  if (video.available()) {
    // Save previous frame for motion detection!!
    prevFrame.copy(video,0,0,video.width,video.height,0,0,video.width,video.height); // Before we read the new frame, we always save the previous frame for comparison!
    prevFrame.updatePixels();
    video.read();
  }
  
  loadPixels();
  video.loadPixels();
  prevFrame.loadPixels();
  
  // Begin loop to walk through every pixel
  for (int x = 0; x < video.width; x ++ ) {
    for (int y = 0; y < video.height; y ++ ) {
      
      int loc = x + y*video.width;            // Step 1, what is the 1D pixel location
      color current = video.pixels[loc];      // Step 2, what is the current color
      color previous = prevFrame.pixels[loc]; // Step 3, what is the previous color
      
      // Step 4, compare colors (previous vs. current)
      float r1 = red(current); float g1 = green(current); float b1 = blue(current);
      float r2 = red(previous); float g2 = green(previous); float b2 = blue(previous);
      float diff = dist(r1,g1,b1,r2,g2,b2);
      
      // Step 5, How different are the colors?
      // If the color at that pixel has changed, then there is motion at that pixel.
      if (diff > threshold) { 
        // If motion, display black
        pixels[loc] = color(0);
      } else {
        // If not, display white
        pixels[loc] = color(255);
      }
    }
  }
  updatePixels();
}
  • zohar avgar

    How can you capture a frame from this video to be an image?

  • admin

    You can do this by writing the pixels to a new PImage object, like in this example:

    http://www.learningprocessing.com/examples/chapter-15/example-15-10/

  • Ad

    Thanks alot, this works great :-)

  • Ephrat

    How can I tell if there is motion taking place in specific parts of the captured video. For example if my size is (320,240) and I want to know if there is motion when 0 < x < 100 ; 120 < x < 220 ; 240 < x < 320?

  • http://www.learningprocessing.com Daniel Shiffman

    You need to keep track of which x,y locations contain motion. For example, you could use an ArrayList and each time you find a motion pixel, add the (x,y) data (perhaps as a PVector) to that ArrayList. Once you have that you could analyze the points an number of ways — look for overall average location of motion, do blob detection, etc.

  • Ephrat

    Thanks!

  • http://www.fsb.hr Knez

    I wonder if You can help me, and describe a little more (or give a hint) how to take an image (which will be stored somewhere on hdd) when web cam detects motion? Thank you anyway!

  • http://www.learningprocessing.com Daniel Shiffman

    Use the save() method!

    video.save(“motion.jpg”);

    along with a conditional to determine the overall motion (see: http://www.learningprocessing.com/examples/chapter-16/example-16-14/) that should do the trick!

    http://processing.org/reference/save_.html

  • http://www.fsb.hr Knez

    Finished!

    Works like charm. Thanks a lot.

  • http://martablicharz.com Marta Blicharz

    Hi,

    I am trying to do a project that uses webcam motion detection to produce a “flashlight” or some concentrated distortion effect in a separate jpeg image (for example a picture of a car). The place of the motion in the webcam would correspond to the position of the distortion of pixels in the other image. Can you please point me to examples that would enable me to do this effectively?

    Thanks for your time!

  • Pepe100

    This is great, i am currently using processing to control video. Iv only been at it a day but would like to use motion capture to trigger a video to play and then pause when no motion is detected, and so on. I have never used processing before today so getting my head round the coding is proving tough. I have another piece of code that can pause the video using a mouse, is there a way to combine parts of both codes to trigger the video?

  • http://twitter.com/shiffman Daniel Shiffman

    I would take a look at the overall motion example, you could use an if statment to play the video only when the overall average motion is above a certain threshold. good luck!

    http://www.learningprocessing.com/examples/chapter-16/example-16-14/