/** * Mirror * by Daniel Shiffman. * * Each pixel from the video source is drawn as a rectangle with rotation based on brightness. */ import processing.video.*; // Size of each cell in the grid int cellSize = 20; // Number of columns and rows in our system int cols, rows; // Variable for capture device Capture video; void setup() { size(640, 480, P3D); frameRate(30); cols = width / cellSize; rows = height / cellSize; colorMode(RGB, 255, 255, 255, 100); // Uses the default video input, see the reference if this causes an error video = new Capture(this, width, height, 12); background(0); } void draw() { if (video.available()) { video.read(); video.loadPixels(); // Not bothering to clear background // background(0); int brightestX = 0; // X-coordinate of the brightest video pixel int brightestY = 0; // Y-coordinate of the brightest video pixel float brightestValue = 0; int index = 0; for (int y = 0; y < video.height; y++) { for (int x = 0; x < video.width; x++) { // Get the color stored in the pixel int pixelValue = video.pixels[index]; // Determine the brightness of the pixel float pixelBrightness = brightness(pixelValue); // If that value is brighter than any previous, then store the // brightness of that pixel, as well as its (x,y) location if (pixelBrightness > brightestValue){ brightestValue = pixelBrightness; brightestY = y; brightestX = x; } index++; } } // Begin loop for columns for (int i = 0; i < cols; i++) { // Begin loop for rows for (int j = 0; j < rows; j++) { // Where are we, pixel-wise? int x = i*cellSize; int y = j*cellSize; int loc = (video.width + x) + y*video.width; // Reversing x to mirror the image float r = red(video.pixels[loc]); float g = green(video.pixels[loc]); float b = blue(video.pixels[loc]); // Make a new color with an alpha component color c = color(r, g, b, 75); // Code for drawing a single rect // Using translate in order for rotation to work properly pushMatrix(); translate(x+cellSize/2, y+cellSize/2); // Rotation formula based on brightness rotate((2 * PI * brightness(c) / 255.0)); rectMode(CENTER); fill(c,12); noStroke(); // Rects are larger than the cell for some overlap ellipse(10, 10, cellSize, cellSize-6); popMatrix(); fill(253); ellipse(brightestX, brightestY,50, 50); } } } }