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.
[youtube=http://www.youtube.com/watch?v=mDZOfIz1aKo]

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();
}
}

[youtube=http://www.youtube.com/watch?v=avVRTfz34pI]

9 COMMENTS

  1. hola como estas?? que pena molestarte tengo un problemita y es que cuando inicia el programa el video se ve como corrido como deforme se ve divido en lineas y apenas se distingue. las bolas si salen bien.

    Con otros ejemplos el video me funciona bien, es con la libreria,, sabes algo para arreglarlo?

    uso w7

    Gracia.

    • El problema es que nosotros usamos distintos Windows. Yo tengo un xp. Si sale rayas por lo general es por la calidad del video o de la tarjeta de video. Lo que puedes hacer es reducir las proporciones del video. Pruebalo y me comentas.

      Saludos

  2. hola, me podrias pasar las librerias porfa, estoy realizando mi tesis y ya tengo bastante avanzada y no quiero comenzar de nuevo. solamente quiero agregar las librerias a mi proyecto. gracias

  3. Gracias Emilio, otra preguntita. En Proccesing se puede crear menus (mensajes en ventana, botones y para introducir texto), manejar sqlite y enviar mensajes por correo?? SORRY por la pregunta es que estoy programando en android con eclipse y si se puede hacer en Proccesing, lo haria ahí, aunque comenzaria de cero :-(. lo de bluetooth acabo de ver una pagina que si puede manejar.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.