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.
- Descargen la librería e instalen. Si no saben como instalar una librería. Mi estilo (no el mejor) es este.
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]



Deja un comentario