Tutorial: Detección de movimiento Processing

Avatar de Emiliusvgs - Emilio Vegas

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]

Enjoying this article?

Subscribe to get new posts delivered straight to your inbox. No spam, unsubscribe anytime.

No spam. Unsubscribe anytime.

You may also like

See All Posts →

9 responses to “Tutorial: Detección de movimiento Processing”

  1. Avatar de juan eduardo

    me sale un error en la linea :
    flob = new Flob(this, video, width, height);
    dice :
    the contructor Flob(sketch_sep12a,capture,int,int) is undefined
    xq es este error

    1. Avatar de juan eduardo

      ya lo soluciones gracias…

  2. Avatar de juan eduardo

    un enorme favor sera que pudes explicar par auqe usas cada variable… y cada IF CADA for y sus clases del FLOB
    gracias
    saludos…

  3. Avatar de carlos perez
    carlos perez

    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.

    1. Avatar de emilio vegas ubillus
      emilio vegas ubillus

      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

  4. Avatar de Luis Fernando Lopez
    Luis Fernando Lopez

    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

    1. Avatar de Emilio Vegas
      Emilio Vegas

      Hola Luis
      La librería está en el enlace. Allí podrás sacar la información. Se trabajó con processing

      Slds

  5. Avatar de Luis Fernando Lopez
    Luis Fernando Lopez

    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.

    1. Avatar de Emilio Vegas
      Emilio Vegas

      Hola!
      Nada mejor que preguntar para conocer más 🙂
      Hay librería para todo en processing. Para interfaz como botones, checkboxes http://www.sojamo.de/libraries/controlP5/
      Puedes mandar correos vía processing teniendo en cuenta el tutorial de Shiffman http://shiffman.net/2007/11/13/e-mail-processing/
      Sobre Sqlite hay más información aquí https://github.com/fjenett/sql-library-processing
      Ejemplo http://forum.processing.org/two/discussion/3719/connect-to-sqlite/p1

      Espero que te sirva
      Slds

Deja un comentario

This site uses Akismet to reduce spam. Learn how your comment data is processed.