User Tools

Site Tools


processing:video_capture

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
processing:video_capture [2013/04/12 02:30] mithatprocessing:video_capture [2013/08/23 04:10] (current) – [Video capture examples] mithat
Line 1: Line 1:
-====== Video Capture Examples ======+====== Video capture examples ======
  
-Examples below have been adapted from the [[http://www.processing.org/reference/libraries/video/Capture.html|Processing 2.0 library reference]] and from examples at [[http://www.learningprocessing.com/|Learning Processing]].+The examples below lean heavily on documentation and code from the [[http://www.processing.org/reference/libraries/video/Capture.html|Processing 2.0 library reference]] and at [[http://www.learningprocessing.com/|Learning Processing]].
  
 ===== List available capture devices ===== ===== List available capture devices =====
 +You'll need at least one available device to do video capture. The following sketch will print out a list of available capture devices to the console. On Linux (the only platform I tested) different resolutions show up as different devices.
 +
 <file java list_capture_devices.pde> <file java list_capture_devices.pde>
 /** Print out a list of available capture (i.e., video) devices /** Print out a list of available capture (i.e., video) devices
Line 29: Line 31:
  
 ===== Show video ===== ===== Show video =====
 +There are two ways you can set up video capture: by requesting capture parameters or specifying the device.
 +
 ==== By requesting capture parameters ==== ==== By requesting capture parameters ====
 <file java show_capture_by_parameters.pde> <file java show_capture_by_parameters.pde>
Line 64: Line 68:
  
 ==== By specifying device ==== ==== By specifying device ====
-Note that Processing will crop the capture to the canvas size if it doesn't fit.+Processing will crop the capture to the canvas size if it doesn't fit.
  
 <file java show_capture_by_devnum.pde> <file java show_capture_by_devnum.pde>
Line 110: Line 114:
 </file> </file>
  
-<WRAP center round info 80%>+ 
 +<WRAP center round tip 80%>
 ===== Capture is a PImage ===== ===== Capture is a PImage =====
  
-Something the documentation on the ''Capture'' class doesn’t mention is that ''[[http://processing.org/reference/libraries/video/Capture.html|Capture]]'' is derived from ''[[http://processing.org/reference/PImage.html|PImage]]''. You need to dig into the ''Capture'' source code to figure that out:+Something the [[http://processing.org/reference/libraries/video/Capture.html|documentation]] on the Capture class doesn’t mention is that Capture is derived from [[http://processing.org/reference/PImage.html|PImage]]. This is the key to manipulating Capture output. You need to dig into the Capture source code to figure that out:
  
 <code java>public class Capture extends PImage implements PConstants { ...</code> <code java>public class Capture extends PImage implements PConstants { ...</code>
  
-This means all the methods and fields available to ''PImage'' objects should also be available to ''Capture'' objects. This is the key to manipulating ''Capture'' output.+This means all the methods and fields available to PImage objects should also be available to Capture objects.
 </WRAP> </WRAP>
  
Line 184: Line 189:
 </file> </file>
  
 +This version walks through each pixel in the reduced image and renders its value as an NxN block. (N is called OUTPUT_SCALE in the code below.)
 +
 +<file java capture_reduce_res-2.pde>
 +/** Reduce resolution of captured image. Display results in blocks.
 + * @author Mithat Konar
 + */
 +
 +import processing.video.*;
 +
 +// === Program constants === //
 +// Rendering parameters:
 +// number of cells the rendered image should be in each direction:
 +final int REDUCED_WIDTH = 32;
 +final int REDUCED_HEIGHT = 24;
 +
 +// Canvas parameters:
 +// number of times you want REDUCED image blown up:
 +final int OUTPUT_SCALE = 10;
 +// frame rate of rendered output:
 +final int CANVAS_FPS = 8;
 +
 +// Video capture parameters
 +// (adjust as neeeded for your platform's available capture options):
 +final int CAM_WIDTH = 320;
 +final int CAM_HEIGHT = 240;
 +final int CAM_FPS = 15;
 +
 +// === Global variables ===//
 +Capture cam;  // The video capture device.
 +PImage img;   // Buffer image.
 +
 +// === GO! === //
 +void setup() {
 +  frameRate(CANVAS_FPS);
 +  size(REDUCED_WIDTH*OUTPUT_SCALE, REDUCED_HEIGHT*OUTPUT_SCALE);
 +
 +  if (Capture.list().length == 0) {
 +    println("There are no cameras available for capture.");
 +    exit();
 +  }
 +
 +  // Instantiate a buffer image used for subsampling, etc.
 +  img = createImage(REDUCED_WIDTH, REDUCED_HEIGHT, RGB);
 +
 +  // Instantiate a new Capture object, requesting the specs:
 +  cam = new Capture(this, CAM_WIDTH, CAM_HEIGHT, CAM_FPS);
 +  cam.start();  // In Processing 2.0, you need to start the capture device
 +}
 +
 +void draw() {
 +  // Grab a frame
 +  if (cam.available() == true) {
 +    cam.read();
 +  }
 +
 +  // Using a buffer because
 +  // cam.resize(REDUCED_WIDTH, REDUCED_HEIGHT);
 +  // doesn't work :-(
 +  img.copy(cam, 0, 0, CAM_WIDTH, CAM_HEIGHT, 0, 0, REDUCED_WIDTH, REDUCED_HEIGHT);
 +  img.loadPixels();
 +
 +  // For each column in img:
 +  for (int col = 0; col < REDUCED_WIDTH; col++) {
 +    // For each row in img:
 +    for (int row = 0; row < REDUCED_HEIGHT; row++) {
 +      // Get color from pixel at col, row
 +      color c = img.pixels[col + row*img.width];
 +      fill(c);
 +      stroke(c);
 +      rect(col*OUTPUT_SCALE, row*OUTPUT_SCALE, OUTPUT_SCALE, OUTPUT_SCALE);
 +    }
 +  }
 +}
 +
 +</file>
 +
 +You can render grayscale instead of color above by replacing the line <code java>color c = img.pixels[col + row*img.width];</code> with <code java>float c = brightness(img.pixels[col + row*img.width]);</code>
 +
 +
 +===== Brightest pixel =====
 +The following example takes the reduced resolution camera feed above and draws a colored circle inside the brightest pixel found. If there is more than one pixel with the same brightness, then it shows the first one (scanning from top-left to bottom-right). It also adds some code to indicate frame timing.
 +
 +<file java capture_brightest_pixel.pde>
 +/** Reduce resolution of captured image and indicate brightest pixel. 
 + * @author Mithat Konar
 + */
 +
 +import processing.video.*;
 +
 +// === Program constants === //
 +// Rendering parameters:
 +// number of cells the rendered image should be in each direction:
 +final int REDUCED_WIDTH = 32;
 +final int REDUCED_HEIGHT = 24;
 +
 +// Canvas parameters:
 +// number of times you want REDUCED image blown up:
 +final int OUTPUT_SCALE = 20;
 +// frame rate of rendered output:
 +final int CANVAS_FPS = 6;  // should divide evenly into CAM_FPS
 +// to avoid jitter.
 +
 +// Video capture parameters
 +// (adjust as neeeded for your platform's available capture options):
 +final int CAM_WIDTH = 320;
 +final int CAM_HEIGHT = 240;
 +final int CAM_FPS = 30;
 +
 +// === Global variables ===//
 +Capture cam;  // The video capture device.
 +PImage img;   // Buffer image.
 +
 +int blink_state = 0;
 +
 +// === GO! === //
 +void setup() {
 +  frameRate(CANVAS_FPS);
 +  size(REDUCED_WIDTH*OUTPUT_SCALE, REDUCED_HEIGHT*OUTPUT_SCALE);
 +  ellipseMode(CORNER);
 +
 +  if (Capture.list().length == 0) {
 +    println("There are no cameras available for capture.");
 +    exit();
 +  }
 +
 +  // Instantiate a buffer image used for subsampling, etc.
 +  img = createImage(REDUCED_WIDTH, REDUCED_HEIGHT, RGB);
 +
 +  // Instantiate a new Capture object, requesting the specs:
 +  cam = new Capture(this, CAM_WIDTH, CAM_HEIGHT, CAM_FPS);
 +  cam.start();  // In Processing 2.0, you need to start the capture device
 +}
 +
 +void draw() {
 +  int brightestCol = 0;
 +  int brightestRow = 0;
 +  float bightestIntensity = 0.0;
 +  
 +  // Grab a frame
 +  if (cam.available() == true) {
 +    cam.read();
 +  }
 +
 +  // We are using a buffer img because
 +  // cam.resize(REDUCED_WIDTH, REDUCED_HEIGHT);
 +  // doesn't work :-(
 +  img.copy(cam, 0, 0, CAM_WIDTH, CAM_HEIGHT, 0, 0, REDUCED_WIDTH, REDUCED_HEIGHT);
 +  img.loadPixels();
 +
 +  // For each column in img:
 +  for (int col = 0; col < REDUCED_WIDTH; col++) {
 +    // For each row in img:
 +    for (int row = 0; row < REDUCED_HEIGHT; row++) {
 +      // Draw the pixel intensity.
 +      float pixelIntensity = brightness(img.pixels[col + row*img.width]);
 +      fill(pixelIntensity);
 +      stroke(pixelIntensity);
 +      rect(col*OUTPUT_SCALE, row*OUTPUT_SCALE, OUTPUT_SCALE, OUTPUT_SCALE);
 +
 +      // Determine whether this is the brightest pixel in this frame.
 +      if (pixelIntensity > bightestIntensity)
 +      {
 +        bightestIntensity = pixelIntensity;
 +        brightestCol = col;
 +        brightestRow = row;
 +      }
 +    }
 +  }
 +
 +  // Highlight brightest pixel.
 +  fill(#000000, 0);
 +  stroke(#ff0000);
 +  strokeWeight(2);
 +  ellipse(brightestCol*OUTPUT_SCALE, brightestRow*OUTPUT_SCALE,
 +       OUTPUT_SCALE, OUTPUT_SCALE);
 +  
 +  // Frame timer
 +  fill(#000099, 100);
 +  stroke(#0000ff, 100);
 +  strokeWeight(1);
 +  blink_state = ++blink_state % CANVAS_FPS;
 +  rect(0, 0, blink_state*OUTPUT_SCALE, OUTPUT_SCALE);
 +}</file>
processing/video_capture.1365733833.txt.gz · Last modified: 2013/04/12 02:30 by mithat

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki