// 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() {
  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!
  // 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);
  • http://chetanbhasin.com/ Chetan Bhasin

    Which programming language is this? I landed on this page through Google so don’t really know what’s going on.

  • Kye

    is this apply to processing 2.1.1??

  • Nguyen Tung Son

    Mine still doesn’t work after I add video.start()? Can you help me?

  • christian

    is there a way to get this working with P3D?

  • Sebastian Vox

    put the “video.start();” line at the end of “void setup()” just before the ” } “

  • Pip Kolmar

    This code has been incredibly helpful to me, but I am currently experiencing a snag. Instead of comparing the last frame to current frame, I am comparing the current frame to a still image to trigger an action based on when someone steps into the frame. I am only able to pick up drastic pixel differences in the bottom right hand corner of the window. If someone walks in from the left, it is only after their image travels across and they hit the right edge of the window that the action is triggered. I can follow up with additional info and code if necessary.

  • yl

    Is this issue ever solved for you?