Bonjour,
J'ai réalisé un projet avec une kinect et processing, où l'utilisateur réalise des mouvements et les tracés s'affichent en direct sur un écran. Ce que je voudrais à présent, c'est pouvoir sauvegarder les tracés et les sortir en fichier image.
Dans mon code, les tracés suivent la main mais ne reste pas à l'écran, ce que j'aimerai enregistré toutes les trajectoires (par exemple pour un temps donnés) Je ne sais pas si je suis très claire. je vous poste mon code en dessous. (ainsi qu'un fichier exemple). Merci beaucoup. Mary
-----
import SimpleOpenNI.*;
SimpleOpenNI context;
// pour le texte typo consigne
PFont font;
int x=30;
//
PGraphics pg;
PVector lastPointPos;
int currentState= 0;
int numStates = 5; //nb etapes
void setup()
{
size(640,480);
frameRate(60); //regler la sensibilité
context = new SimpleOpenNI(this,SimpleOpenNI.RUN_MODE_MULTI_THREADED);
if(context.isInit() == false)
{
println("Can't init SimpleOpenNI, maybe the camera is not connected!");
exit();
return;
}
// enable depthMap generation
context.enableDepth();
// enable skeleton generation for all joints
context.enableUser();
background(200,0,0);
stroke(0,0,255); // dessin
smooth();
pg = createGraphics(width,height);
pg.beginDraw();
pg.background(0,0);
pg.endDraw();
}
void draw()
{
background(0);
context.update();
image(context.userImage(),0,0);
image(pg,0,0,width,height); //Afficher l'image directement
//blend(pg,0,0,width,height,0,0,width,height,ADD); //Fusion avec l'image
processUserDrawing();
drawState();
}
void processUserDrawing()
{
int userId = getFirstTrackedUserIndex();
if(userId == -1) return;
PVector leftHandPos = getJointPosition2D(userId,SimpleOpenNI.SKEL_LEFT_HAND);
PVector rightHandPos = getJointPosition2D(userId,SimpleOpenNI.SKEL_RIGHT_HAND); // detecte position de la md dans skeleton
boolean keepDrawing = rightHandPos.y < height /3; //dessin en continue avec main d
pg.beginDraw();
if(!keepDrawing)
{
pg.fill(0,50);
pg.rect(0,0,pg.width,pg.height);
}
pg.pushStyle();
if(currentState == 0) pg.stroke(255,255,255); // chgt couleur
else pg.stroke(255,255,255);
if(lastPointPos == null) lastPointPos = leftHandPos;
float dist = PVector.dist(lastPointPos,leftHandPos);
//pg.strokeWeight(dist/3f);
pg.strokeWeight(30.0);
pg.strokeCap(ROUND);
pg.fill(255,255,255);
pg.line(lastPointPos.x,lastPointPos.y,leftHandPos.x,leftHandPos.y); //// changer la forme ici du visuel//
pg.popStyle();
pg.endDraw();
lastPointPos = leftHandPos;
}
void drawState()
{
pushStyle();
textSize(20);
switch(currentState)
{
case 0:
// text("",x, 100);
break;
case 1:
text("Placez votre main droite sur votre côté gauche, aller légèrement vers la droite",x , 100);
textAlign(CENTER);
//x=x+1;
break;
case 2:
text("ETAPE 3 ",10,10,100,60);
break;
case 3:
text("ETAPE 4 ",10,10,100,60);
break;
case 4:
text("MERCI ",10,10,100,60);
break;
}
popStyle();
}
int getFirstTrackedUserIndex()
{
int[] userList = context.getUsers();
for(int i=0;i<userList.length;i++)
{
if(context.isTrackingSkeleton(userList[i]))
{
return userList[i];
}
}
return -1;
}
void onNewUser(SimpleOpenNI curContext, int userId)
{
println("onNewUser - userId: " + userId);
println("\tstart tracking skeleton");
curContext.startTrackingSkeleton(userId);
}
public PVector getJointPosition2D(int userId, int jointId)
{
PVector joint2D = new PVector();
context.convertRealWorldToProjective(getJointPosition(userId,jointId),joint2D);
return joint2D;
}
public PVector getJointPosition(int userId, int jointId)
{
PVector joint = new PVector();
context.getJointPositionSkeleton(userId, jointId, joint);
return joint;
}
void keyPressed()
{
switch(key)
{
case 'n':
setNextState();
break;
case 'p':
setPrevState();
break;
}
}
// compteur void time()
void setNextState()
{
setState((currentState+1)%numStates);
}
void setPrevState()
{
setState((currentState+numStates-1)%numStates);
}
void setState(int state)
{
currentState = state;
switch(currentState)
{
case 0:
//on peut mettre des actions qui ne vont etre déclenchées qu'une seule fois a l'entrée d'un state
break;
//....
}
}
Dernière modification par martymarin (2016-05-09 12:06:29)
Hors ligne
Bonjour,
Le principe est de sauvegarder les PGraphics dans un tampon. Lors de la sauvegarde on "affiche" dans un PGraphics tous ceux du tampon avant d'enregistrer.
ArrayList<PGraphics> tampon; int tailleTampon; void setup() { size(800, 600); tampon = new ArrayList<PGraphics>(); tailleTampon = 20; } void draw() { background(0); PGraphics img = createGraphics(width, height); img.beginDraw(); img.fill(255); img.ellipse(mouseX, mouseY, 50, 50); img.endDraw(); tampon.add(img); if (tampon.size() >= tailleTampon) { tampon.remove(0); } image(img, 0, 0); } void keyPressed() { PGraphics img = createGraphics(width, height); img.beginDraw(); for (PGraphics pg : tampon) { img.image(pg, 0, 0); } img.endDraw(); img.save("tata.jpg"); }
Hors ligne
désolé je suis débutante, mais je ne comprend pas comment je dois intégrer et où ça dans mon code
Hors ligne
Pages: 1