Tutorial: Detección de movimiento

Hola este es un pedido especial de un lector que preguntaba cómo realizar detección de movimiento con processing. Vamos a explicar un poco el proceso para lograr esto. Es necesario explicar cómo funciona para tener cierta lógica en el momento que uno vaya a tocar los códigos.

La librería que voy a usar se llama FLob. También exista otra librería más conocida para la detección de movimiento llamada Jmyron , pero por cuestiones de incompatibilidades con mi windows, no podré explicarles esta última librería.

Flob reconoce el movimiento que se visualiza en la cámara atraves de coordenadas que se reflejan en cuadrados. Es por eso que cuando uno prueba uno de los ejemplos puede ver que a medida que se haga más movimiento, el cuadrado que recubrirá al objeto (pierna, brazo, ojo) se hará más grande.

Voy a explicar cómo hice este video.

Lo interesante de esto es que se puede realizar cosas muy buenas apartir de ejemplo. Lo que les mostraré es basicamente un código limpio de un ejemplo de FLOB.

  • Importamos las librerías

import processing.opengl.*;
import processing.video.*;
import s373.flob.*;

  • Llamamos a las funciones y variables

Capture video;
Flob flob;

int videores=128;
int fps = 60;

Bola bolas[];

boolean showcamera=false;
boolean om=true,omset=false;
float velmult = 100.0f;

  • Iniciamos con el setup

void setup(){

size(640,480,OPENGL);
frameRate(fps);

//Aqui va la lista de dispositivos de camara web que tengas
String[] devices = Capture.list();

video = new Capture(this, videores, videores,  devices[0], fps);

//Aqui van las caracteristicas del efecto que se mostrará
flob = new Flob(this, video, width, height);
flob.setMirror(true,false);
flob.setThresh(12);
flob.setFade(25);
flob.setMinNumPixels(10);

//aqui en agregado solo una bola o circulo
bolas = new Bola[1];
for(int i=0;i<bolas.length;i++){
bolas[i] = new Bola();
}

}

  • Iniciamos el draw

void draw(){
if(video.available()) {
if(!omset){
if(om)
flob.setOm(flob.CONTINUOUS_DIFFERENCE);
else
flob.setOm(flob.STATIC_DIFFERENCE);
omset=true;
}
video.read();

flob.calcsimple(  flob.binarize(video) );
}

image(flob.getSrcImage(), 0, 0, width, height);

  •  colision, el efecto de rebote

float cdata[] = new float[5];
for(int i=0;i<bolas.length;i++){
float x = bolas[i].x / (float) width;
float y = bolas[i].y / (float) height;
cdata = flob.imageblobs.postcollidetrackedblobs(x,y,bolas[i].rad/(float)width);
if(cdata[0] > 0) {
bolas[i].toca=true;
bolas[i].vx +=cdata[1]*width*0.015;
bolas[i].vy +=cdata[2]*height*0.015;
}
else {
bolas[i].toca=false;
}
bolas[i].run();
}

if(showcamera){
tint(255,150);
image(flob.videoimg,width-videores,height-videores);
image(flob.videotexbin,width-2*videores,height-videores);
image(flob.videotexmotion,width-3*videores,height-videores);
}

}

Aqui termina el primer sketch. Por motivos de orden se abrirá otro sketch e introduciremos la clase o “class Bolas”

class Bola
{

float x,y,vx,vy;
float g = 0.025, rad= random(15,25);
boolean toca=false;
Bola(){
init();
}
void init(){
vx = random(-1.1,1.1);
vy = random(1.5);
x = random(width);
y = random(-100,-50);
}
void update(){
// vy+=g;
// vx+=g;
x+=vx;
y+=vy;

if(abs(vx)>3)
vx*=0.9;
if(abs(vy)>3)
vy*=0.9;

if(x<-rad){
x=-rad;
vx = -vx;
}
if(x>width+rad){
x=width+rad;
vx = -vx;
}
if(y<-100){
y=-100;
vy = -vy;
}
if(y>height-rad){
y=height-rad;
vy = -vy;
}

}
void draw(){
if(!toca)
fill(560,255,0);
else
fill(255,20,100);
ellipse(x,y,rad*2,rad*2);
}
void run(){
update();
draw();
}
}

Recibe toda la información necesaria sobre realidad aumentada y el mundo de la innovación. Descarga gratis material especial de nuestra comunidad.

9 Comments

  1. juan eduardo September 12, 2011
  2. juan eduardo September 14, 2011
  3. carlos perez November 19, 2011
    • emilio vegas ubillus November 23, 2011
  4. Luis Fernando Lopez August 12, 2014
    • Emilio Vegas August 12, 2014
  5. Luis Fernando Lopez August 14, 2014

Leave a Reply