Skip to content

Instantly share code, notes, and snippets.

@mudphone
Created August 30, 2014 02:38

Revisions

  1. mudphone created this gist Aug 30, 2014.
    83 changes: 83 additions & 0 deletions TimeDisplacement.pde
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,83 @@
    /**
    * Time Displacement
    * by David Muth
    *
    * Keeps a buffer of video frames in memory and displays pixel rows
    * taken from consecutive frames distributed over the y-axis
    */

    import processing.video.*;

    Capture video;
    int signal = 0;

    //the buffer for storing video frames
    ArrayList frames = new ArrayList();

    void setup() {
    size(640, 480);

    // This the default video input, see the GettingStartedCapture
    // example if it creates an error
    video = new Capture(this, width, height);

    // Start capturing the images from the camera
    video.start();
    }

    void captureEvent(Capture camera) {
    camera.read();

    // Copy the current video frame into an image, so it can be stored in the buffer
    PImage img = createImage(width, height, RGB);
    video.loadPixels();
    arrayCopy(video.pixels, img.pixels);

    frames.add(img);

    // Once there are enough frames, remove the oldest one when adding a new one
    if (frames.size() > height/4) {
    frames.remove(0);
    }
    }

    void draw() {
    // Set the image counter to 0
    int currentImage = 0;

    loadPixels();

    // Begin a loop for displaying pixel rows of 4 pixels height
    for (int y = 0; y < video.height; y+=4) {
    // Go through the frame buffer and pick an image, starting with the oldest one
    if (currentImage < frames.size()) {
    PImage img = (PImage)frames.get(currentImage);

    if (img != null) {
    img.loadPixels();

    // Put 4 rows of pixels on the screen
    for (int x = 0; x < video.width; x++) {
    pixels[x + y * width] = img.pixels[x + y * video.width];
    pixels[x + (y + 1) * width] = img.pixels[x + (y + 1) * video.width];
    pixels[x + (y + 2) * width] = img.pixels[x + (y + 2) * video.width];
    pixels[x + (y + 3) * width] = img.pixels[x + (y + 3) * video.width];
    }
    }

    // Increase the image counter
    currentImage++;

    } else {
    break;
    }
    }

    updatePixels();

    // For recording an image sequence
    //saveFrame("frame-####.jpg");
    }