topical media & game development

talk show tell print

graphic-processing-site-examples-Libraries-Video--Capture--FrameDifferencing-FrameDifferencing.pde / pde



  
Frame Differencing by Golan Levin. Quantify the amount of movement in the video frame using frame-differencing.

   
  
  import processing.video.*;
  
  int numPixels;
  int[] previousFrame;
  Capture video;
  
  void setup() {
    size(640, 480); // Change size to 320 x 240 if too slow at 640 x 480
    // Uses the default video input, see the reference if this causes an error
    video = new Capture(this, width, height, 24);
    numPixels = video.width * video.height;
    // Create an array to store the previously captured frame
    previousFrame = new int[numPixels];
    loadPixels();
  }
  
  void draw() {
    if (video.available()) {
      // When using video to manipulate the screen, use video.available() and
      // video.read() inside the draw() method so that it's safe to draw to the screen
      video.read(); // Read the new frame from the camera
      video.loadPixels(); // Make its pixels[] array available
      
      int movementSum = 0; // Amount of movement in the frame
      for (int i = 0; i < numPixels; i++) { // For each pixel in the video frame...
        color currColor = video.pixels[i];
        color prevColor = previousFrame[i];
        // Extract the red, green, and blue components from current pixel
        int currR = (currColor >> 16) & 0xFF; // Like red(), but faster
        int currG = (currColor >> 8) & 0xFF;
        int currB = currColor & 0xFF;
        // Extract red, green, and blue components from previous pixel
        int prevR = (prevColor >> 16) & 0xFF;
        int prevG = (prevColor >> 8) & 0xFF;
        int prevB = prevColor & 0xFF;
        // Compute the difference of the red, green, and blue values
        int diffR = abs(currR - prevR);
        int diffG = abs(currG - prevG);
        int diffB = abs(currB - prevB);
        // Add these differences to the running tally
        movementSum += diffR + diffG + diffB;
        // Render the difference image to the screen
        pixels[i] = color(diffR, diffG, diffB);
        // The following line is much faster, but more confusing to read
        //pixels[i] = 0xff000000 | (diffR << 16) | (diffG << 8) | diffB;
        // Save the current color into the 'previous' buffer
        previousFrame[i] = currColor;
      }
      // To prevent flicker from frames that are all black (no movement),
      // only update the screen if the image has changed.
      if (movementSum > 0) {
        updatePixels();
        println(movementSum); // Print the total amount of movement to the console
      }
    }
  }
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.