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]
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
ya lo soluciones gracias…
un enorme favor sera que pudes explicar par auqe usas cada variable… y cada IF CADA for y sus clases del FLOB
gracias
saludos…
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
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
Hola Luis
La librería está en el enlace. Allí podrás sacar la información. Se trabajó con processing
Slds
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.
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