Goju-Ryu
YaBB Newbies
Offline
Posts: 18
Control mouse cursor with face
Jan 20th , 2009, 12:55am
Hello all! I wrote the code below to control the mouse cursor with the position of the center of my face relatively to a grid. I'm having some doubts/lack of imagination: 1 - is it possible to keep my sketch window always on front (visible, king of floating over the other windows?) 2 - how do I thick the point I overlay on the image on the position corresponding to the center of the detected face? I already tried to use strokeWeight(10) before point(...) but the grid also got thick. I tried pushMatrix() strokeWeight() point() popMatrix() but the result was the same. 3 - Would you do this (control the mouse with your face) in the same way? If not, how would you do it? You can access the .xml files for face and hand detection on the following links: http://inside.webhs.org/aGest.xml http://inside.webhs.org/haarcascade_frontalface_alt.xml These files should be placed inside a folder named "data" inside the sketch folder. Any help would be greatly appreciated. Thank you very much in advance. Best regards! import JMyron.*; import pFaceDetect.*; JMyron m; PFaceDetect face; PFaceDetect hand; PImage img; Robot robby; int search_width = 320; int search_height = 240; float actualX=search_width/2; float actualY=search_height/2; int x_rato = 0; int y_rato = 0; void setup() { size(320,240,P3D); m = new JMyron(); m.start(width,height); face = new PFaceDetect(this,width,height, "haarcascade_frontalface_alt.xml"); hand = new PFaceDetect(this,width,height, "aGest.xml"); img = createImage(width,height,ARGB); noFill(); stroke(255,0,0); try { robby = new Robot(); } catch (AWTException e) { println("Robot class not supported by your system!"); exit(); } } void draw() { m.update(); //code for flipping int[] imgNormal = m.cameraImage(); this.loadPixels(); for(int i=1; i<width;i++){ for(int j=1;j<height;j++){ this.pixels[(m.width() - i - 1) + j * m.width()] = imgNormal[(i) + j * m.width()]; } } this.updatePixels(); arraycopy(m.cameraImage(),img.pixels); face.findFaces(img); //chama função que detecta caras drawFace(); //desenha info relativa à posição das caras detectadas hand.findFaces(img); drawHand(); // code for drawing the lines line((width/2-10),0,(width/2-10),height); line((width/2+10),0,(width/2+10),height); line(0,(height/2-10),width,(height/2-10)); line(0,(height/2+10),width,(height/2+10)); //verifica posição do ponto //diagonal subir para direita if (actualX < (width/2-10) && actualY < (height/2-10)) { x_rato = x_rato + 4; y_rato = y_rato - 4; } //diagonal subir para esquerda else if (actualX > (width/2+10) && actualY < (height/2-10)) { x_rato = x_rato - 4; y_rato = y_rato - 4; } //subir else if (actualX < (width/2+10) && actualX > (width/2-10) && actualY < (height/2-10)) { y_rato = y_rato - 4; } //descer else if (actualX < (width/2+10) && actualX > (width/2-10) && actualY > (height/2+10)) { y_rato = y_rato + 4; } //diagonal descer para direita else if (actualX < (width/2-10) && actualY > (height/2+10)) { x_rato = x_rato + 4; y_rato = y_rato + 4; } //diagonal descer para esquerda else if (actualX > (width/2+10) && actualY > (height/2+10)) { x_rato = x_rato - 4; y_rato = y_rato + 4; } //movimento horizontal da direita para a esquerda else if (actualX > (width/2+10) && actualY < (height/2+10) && actualY > (height/2-10)) { x_rato = x_rato - 4; } //movimento horizontal da esquerda para a direita else if (actualX < (width/2-10) && actualY < (height/2+10) && actualY > (height/2-10)) { x_rato = x_rato + 4; } print(actualY+"\n"); robby.mouseMove(screen.width/2+x_rato, screen.height/2+y_rato); } void drawFace() { int [][] res = face.getFaces(); if (res.length>0) { for (int i=0;i<res.length;i++) { int x = res[i][0]; int y = res[i][1]; int w = res[i][2]; int h = res[i][3]; x = x + w/2; actualX = round(actualX + 0.1*(x-actualX)); y = y + h/2; actualY = round(actualY + 0.1*(y-actualY)); /*pushMatrix(); strokeWeight(10);*/ point(width-actualX, actualY); //popMatrix(); } } } void drawHand() { int [][] res = hand.getFaces(); if (res.length>0) { print("ai"+"\n"); robby.mousePress(InputEvent.BUTTON1_MASK); robby.delay(500); robby.mouseRelease(InputEvent.BUTTON1_MASK); } } void stop() { m.stop(); super.stop(); }