Processing/JS

Vídeo Ejemplos 4

Tracking por color

import processing.video.*;
Capture video;

// Variable de color
color trackColor;

void setup() {
size(640,480);
video = new Capture(this,width,height,30);
video.start();
// inicializa trackeando el color blanco
trackColor = color(255);
smooth();
}

void draw() {
if (video.available()) {
video.read();
}
video.loadPixels();
image(video,0,0);

// busca hasta encontrar el color que cumple las condiciones
float worldRecord = 500;
// coordenadas X e Y
int closestX = 0;
int closestY = 0;

// bucle para buscar en todos los pixeles de la imagen
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width;

color currentColor = video.pixels[loc];
float r1 = red(currentColor);
float g1 = green(currentColor);
float b1 = blue(currentColor);
float r2 = red(trackColor);
float g2 = green(trackColor);
float b2 = blue(trackColor);

// compara coloresn de la imagen con el color que queremos trackear
float d = dist(r1,g1,b1,r2,g2,b2);

// encuentra el color y nos da sus coordenadas
if (d < worldRecord) {
worldRecord = d;
closestX = x;
closestY = y;
}
}
}

// solo reconoce el track si la diferencia es menor de 10 (puede modificarse)
if (worldRecord < 10) {
// Draw a circulo en el punto en que se trackea
fill(255);
strokeWeight(4.0);
stroke(0);
ellipse(closestX,closestY,16,16);
}
}

void mousePressed() {
// cambia el color a trackear
int loc = mouseX + mouseY*video.width;
trackColor = video.pixels[loc];
}

Detección del movimiento

import processing.video.*;
Capture video;
// imagen anterior
PImage prevFrame;
// la diferencia entre los pixeles debe ser mayor de 50
float threshold = 50;

void setup() {
size(640,480);
video = new Capture(this, width, height, 30);
video.start();
// Crea una imagen vacia del tamaño del video
prevFrame = createImage(video.width,video.height,RGB);
}

void draw() {
if (video.available()) {
// Salva el frame anterior para detectar el movimiento
prevFrame.copy(video,0,0,video.width,video.height,0,0,video.width,video.height);
prevFrame.updatePixels();
video.read();
}

loadPixels();
video.loadPixels();
prevFrame.loadPixels();
// un loop para analizar todos los pixeles
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {

int loc = x + y*video.width; // paso 1, posición del pixel
color current = video.pixels[loc]; // paso 2, color actual
color previous = prevFrame.pixels[loc]; // paso 3, color previo

// paso 4, compara colores (previo vs. actual)
float r1 = red(current); float g1 = green(current); float b1 = blue(current);
float r2 = red(previous); float g2 = green(previous); float b2 = blue(previous);
float diff = dist(r1,g1,b1,r2,g2,b2);

// paso 5, calcula la diferencia entre los colores
// si el color ha cambiado es que hay movimiento
if (diff > threshold) {
// si hay movimiento se colorea de negro
pixels[loc] = color(0);
} else {
// si no se colorea de blanco
pixels[loc] = color(255);
}
}
}
updatePixels();
}

Croma

import processing.video.*;
Capture video;
PImage backgroundImage;

// Diferencia entre los pixeles
float threshold = 20;

void setup() {
size(640,480);
video = new Capture(this, width, height, 5);
video.start();
// Crea una imagen vacia
backgroundImage = createImage(video.width,video.height,RGB);
}

void draw() {
// Capture video
if (video.available()) {
video.read();
}

loadPixels();
video.loadPixels();
backgroundImage.loadPixels();

for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width;
color fgColor = video.pixels[loc];

color bgColor = backgroundImage.pixels[loc];

float r1 = red(fgColor);
float g1 = green(fgColor);
float b1 = blue(fgColor);
float r2 = red(bgColor);
float g2 = green(bgColor);
float b2 = blue(bgColor);
float diff = dist(r1,g1,b1,r2,g2,b2);

if (diff > threshold) {

pixels[loc] = fgColor;
} else {

pixels[loc] = color(0,255,0);
}
}
}
updatePixels();
}

void mousePressed() {
// Cuano pulsas copias el color para convertirlo en el color de croma
backgroundImage.copy(video,0,0,video.width,video.height,0,0,video.width,video.height);
backgroundImage.updatePixels();
}

 

Learning Processing
Daniel Shiffman
http://www.learningprocessing.com