topical media & game development

talk show tell print

graphic-processing-learning-16-example-16-14-example-16-14.pde / pde



  // Learning Processing
  // Daniel Shiffman
  // http://www.learningprocessing.com
  
  // Example 16-14: Overall motion
  
  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);
    // Using the default capture device
    video = new Capture(this, width, height, 15);
    // Create an empty image the same size as the video
    prevFrame = createImage(video.width,video.height,RGB);
  }
  
  void draw() {
    background(0);
    
    // You don't need to display it to analyze it!
    image(video,0,0);
    
    // 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);
      prevFrame.updatePixels();
      video.read();
    }
    
    loadPixels();
    video.loadPixels();
    prevFrame.loadPixels();
    
    // Begin loop to walk through every pixel
    // Start with a total of 0
    float totalMotion = 0;
    
    // Sum the brightness of each pixel
    for (int i = 0; i < video.pixels.length; i ++ ) {
      // Step 2, what is the current color
      color current = video.pixels[i];
      
      // Step 3, what is the previous color
      color previous = prevFrame.pixels[i];
      
      // 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);
      
      // Motion for an individual pixel is the difference between the previous color and current color.
      float diff = dist(r1,g1,b1,r2,g2,b2);
      // totalMotion is the sum of all color differences. 
      totalMotion += diff; 
    }
    
    // averageMotion is total motion divided by the number of pixels analyzed.
    float avgMotion = totalMotion / video.pixels.length; 
    
    // Draw a circle based on average motion
    smooth();
    noStroke();
    fill(0);
    float r = avgMotion*2;
    ellipse(width/2,height/2,r,r);
  
  }
  


(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.