2014-11-23 2 views
0

так, вот вопрос, я должен сделать индикатор положения, соответствующее моей руке положение, а затем выполнить некоторые манипуляции с изображениемОбращая индикатор положения на изображении

здесь является захват экрана: http://i.stack.imgur.com/WZl26.jpg

левая половина экрана - это изображение, а в правой половине экрана находится моя камера, программа нарисует индикатор положения, соответствующий моей позиции в руке, моя проблема в том, что курсор не может исчезнуть, и он будет рисовать много раз!

вот код:

import gab.opencv.*; 
import processing.video.*; 
import java.awt.*; 

PImage img; 
PImage select; 
PImage cur; 

OpenCV opencv; 
Capture cam; 

int prevPositionX, prevPositionY, currPositionX, currPositionY; 
int mode = -1; //mode 1 = s (select) mode 2 = c (copy) mode 3 = d (draw) 
int select_ind = -1; 

//store every dectected things 
Rectangle[] hand; 

//store the biggest hand 
Rectangle bhand; 


void setup() { 
    size(1280, 480); 

    img = loadImage("test.jpg"); 
    cur = loadImage("cursor.png"); 
    stroke(255,10,0); 

    opencv = new OpenCV(this, 640, 480); 
    opencv.loadCascade("aGest.xml"); 
    cam = new Capture(this, 640, 480); 
    cam.start(); 

    image(img, 0, 0, img.width, img.height); 
    } 


    void draw(){ 
    if (cam.available()==true) { 
    cam.read(); 
    } 

    opencv.loadImage(cam); 
    hand = opencv.detect(); 

    pushMatrix(); 
    scale(-1.0, 1.0); 
    image(cam, -1280, 0); 
    popMatrix(); 

int handcount = -1; 
int handsize = -1; 

    //calculate the biggest hand 
    for(int i=0; i < hand.length; i++) { 
    if(handsize < (hand[i].width * hand[i].height)){ 
     handsize = hand[i].width * hand[i].height; 
     handcount = 1; 
     bhand = hand[i];  
    } 
    } 

    if(handcount > 0){ 
     rect(1280 - bhand.x, bhand.y, -bhand.width, bhand.height); 
     noFill(); 

     //draw the position indicator 
     image(cur, 480 - bhand.x, bhand.y, 16, 16); 

     prevPositionX = currPositionX; 
     prevPositionY = currPositionY; 
     currPositionX = 480 - bhand.x + 4; 
     currPositionY = bhand.y; 

     //select mode 
     if (mode == 1){ 
     } 

     //copy mode 
     else if (mode == 2){ 
     } 

     //draw mode 
     else if (mode == 3){ 
     line(prevPositionX,prevPositionY,currPositionX,currPositionY); 
     } 
    }  
} 


void keyPressed(){ 
    if(key=='s'||key=='S') 
    mode = 1; 

    else if(key=='c'||key=='C') 
    mode = 2; 

    else if(key=='d'||key=='D') 
    mode = 3; 

    else if(key=='i'||key=='I') 
    image(img, 0, 0, img.width, img.height); 
    } 



void keyReleased(){ 
    if(select_ind > -1 && mode == 2){ 
    //to be done 

    } 

    mode = -1; 
    } 

Я работаю с режимом рисования, который должен нарисовать линию на изображении, и я знаю эту проблему, но я не знаю, как решить эту проблему, Мне нужно добавить это: image (img, 0, 0, img.width, img.height); к первому функции draw(), но строка также будет удалена. Я хочу сохранить линию, такую ​​как захват экрана. Пожалуйста, дайте мне руку и извините за плохой английский. Спасибо

+0

Что такое 'Capture'? Если это будет сделано в Java Swing, я рассмотрю обзор [Как использовать слоистые панели] (https://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html) – hfontanez

ответ

0

Если вам нужно сохранить только часть розыгрыша, вам нужно перерисовать его каждый кадр, все еще «очищая» фон, используя image(img, 0, 0, img.width, img.height). Это означает, что магазин координаты линий и перерисовать его каждый раз, также отметить, что вы можете скрыть курсор ... примерно так:

// YOU GOT ADD (CLICK) AT LEAST 2 POINTS TO SEE IT WORKING ;) 

ArrayList<PVector> positions = new ArrayList<PVector>(); 

void setup(){ 
    size(600, 600); 

    //if you don't want to see the cursor... 
    noCursor();  
} 

void draw(){ 
    //clear screen 
    background(255); 

    //always draw at mousePosition 
    //a "custom cursor" 
    //that will not persist as screen is beeing cleared 
    fill(200,80,220); 
    noStroke(); 
    ellipse(mouseX, mouseY, 20, 20); 

    stroke(80); 
    PVector prevP = null; 

    for (PVector p:positions) { 
    if(prevP != null) { 
     line(prevP.x, prevP.y, p.x, p.y); 
    } 

    prevP = p.get(); 
    } 
} 

void mouseClicked() { 
    positions.add(new PVector(mouseX, mouseY)); 
} 

EDIT: Также вы можете использовать PGraphics как слои сохраняться только часть чертежа без перерисовывания всего материала снова и снова ... :)