Movie Read (Frame Differencing)

edited June 2016 in Library Questions

What's wrong with my code. The video is playable but it is without the frame differencing filter.

import processing.video.*;

int numPixels;
int[] previousFrame;
Movie video;

void setup() {
  size(1920, 1080);

  // This the default video input, see the GettingStartedCapture 
  // example if it creates an error
  video = new Movie(this, "abc.mp4");

  // Start capturing the images from the camera
     video.loop(); 
   //video.read(); 
  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
    image(video, 0, 0);
    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
    }
  }
}

Answers

  • You're calling read() at 2 places: draw() & movieEvent()!
    Easiest fix is simply remove movieEvent(). Although read() in draw() isn't very performant.

  • Same. Even i removed movieEvent(). Frame differencing filter still not there.

  • Hello, I met the same error with the same code. How did you fix it? My code gives the sounds of my video with the just gray screen. What is the movieEvent() which I should remove?

Sign In or Register to comment.