Estive fazendo alguns experimentos com o processing e a biblioteca TUIO, o tuio é um software que recnhece marcadores e tambem é usado para mesas multitoque. Para conhecer e baixar acesse http://www.tuio.org/.
No vídeo acima eu modifiquei o exemplo que vem com a biblioteca e criei um sketch com um fundo em jpg e duas imagens que são apresentadas na tela dependendo do marcador exibido na webcam.
Segue o código abaixo:
----------------------------------------------------------------------------------------
/* TUIO processing demo - part of the reacTIVision project http://reactivision.sourceforge.net/ Modificado por Miklos em 13/03/2011 - www.miklos.blog.br */ // we need to import the TUIO library // and declare a TuioProcessing client variable import TUIO.*; TuioProcessing tuioClient; // these are some helper variables which are used // to create scalable graphical feedback float cursor_size = 15; float object_size = 120; float table_size = 760; float scale_factor = 1; PFont font; PImage bg; PImage p0; PImage p1; void setup() { size(800,600); bg = loadImage("fundo_teste.gif"); p0 = loadImage("quad_teste.gif"); p1 = loadImage("circ_teste.gif"); //size(screen.width,screen.height); // size(640,480); // noStroke(); // fill(0); loop(); frameRate(30); //noLoop(); hint(ENABLE_NATIVE_FONTS); font = createFont("Arial", 18); scale_factor = height/table_size; // we create an instance of the TuioProcessing client // since we add "this" class as an argument the TuioProcessing class expects // an implementation of the TUIO callback methods (see below) tuioClient = new TuioProcessing(this); } // within the draw method we retrieve a Vector (List) of TuioObject and TuioCursor (polling) // from the TuioProcessing client and then loop over both lists to draw the graphical feedback. void draw() { //background(255); background(bg); textFont(font,18*scale_factor); float obj_size = object_size*scale_factor; float cur_size = cursor_size*scale_factor; Vector tuioObjectList = tuioClient.getTuioObjects(); for (int i=0;i-----------------------------------------------------------------------size();i++) { TuioObject tobj = (TuioObject)tuioObjectList.elementAt(i); String simb = "" + tobj.getSymbolID(); if( simb.equals("1") ){ stroke(0); fill(0); pushMatrix(); translate(tobj.getScreenX(width),tobj.getScreenY(height)); rotate(tobj.getAngle()); // rect(-obj_size/2,-obj_size/2,obj_size,obj_size); image(p0,-obj_size/2,-obj_size/2,obj_size,obj_size); popMatrix(); fill(255); text(""+tobj.getSymbolID(), tobj.getScreenX(width), tobj.getScreenY(height)); } if( simb.equals("2") ){ stroke(0); fill(0); pushMatrix(); translate(tobj.getScreenX(width),tobj.getScreenY(height)); rotate(tobj.getAngle()); // rect(-obj_size/2,-obj_size/2,obj_size,obj_size); image(p1,-obj_size/2,-obj_size/2,obj_size,obj_size); popMatrix(); fill(255); text(""+tobj.getSymbolID(), tobj.getScreenX(width), tobj.getScreenY(height)); } } /* Vector tuioCursorList = tuioClient.getTuioCursors(); for (int a=0;a TuioCursor tcur = (TuioCursor)tuioCursorList.elementAt(a); Vector pointList = tcur.getPath(); if (pointList.size()>0) { stroke(0,0,255); TuioPoint start_point = (TuioPoint)pointList.firstElement();; for (int j=0;j TuioPoint end_point = (TuioPoint)pointList.elementAt(j); line(start_point.getScreenX(width),start_point.getScreenY(height),end_point.getScreenX(width),end_point.getScreenY(height)); start_point = end_point; } stroke(192,192,192); fill(192,192,192); ellipse( tcur.getScreenX(width), tcur.getScreenY(height),cur_size,cur_size); fill(0); text(""+ tcur.getCursorID(), tcur.getScreenX(width)-5, tcur.getScreenY(height)+5); } }*/ } // these callback methods are called whenever a TUIO event occurs // called when an object is added to the scene void addTuioObject(TuioObject tobj) { println("add object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle()); } // called when an object is removed from the scene void removeTuioObject(TuioObject tobj) { println("remove object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+")"); } // called when an object is moved void updateTuioObject (TuioObject tobj) { println("update object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle() +" "+tobj.getMotionSpeed()+" "+tobj.getRotationSpeed()+" "+tobj.getMotionAccel()+" "+tobj.getRotationAccel()); } // called when a cursor is added to the scene void addTuioCursor(TuioCursor tcur) { println("add cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+ ") " +tcur.getX()+" "+tcur.getY()); } // called when a cursor is moved void updateTuioCursor (TuioCursor tcur) { println("update cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+ ") " +tcur.getX()+" "+tcur.getY() +" "+tcur.getMotionSpeed()+" "+tcur.getMotionAccel()); } // called when a cursor is removed from the scene void removeTuioCursor(TuioCursor tcur) { println("remove cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+")"); } // called after each message bundle // representing the end of an image frame void refresh(TuioTime bundleTime) { redraw(); }