Bonsoir,
Je suis actuellement en train de faire un projet Processing relié à ma Kinect, j'ai bien réussi à tout installer au niveau des pilotes et des librairies (SimpleOpenNI), la Kinect est bien reconnue etc... Cependant, je rencontre des problèmes. Mon projet est de mettre une image en fond (ce qui est déjà fait) de ma fenêtre, et de créer plusieurs espaces à certains endroits de cette image qui seront en fait des "boutons", la personne est bien trackée (j'ai utilisé la librairie FingerTracker ou la détection de squelette pour les mains simplement), mais je ne sais pas comment je dois m'y prendre pour que lorsque l'on touche un endroit, une action se produise. Actuellement, j'ai mis des ellipses (à trois endroits) qui devront lancer des actions lorsque l'utilisateur les touchent.
J'ai déjà utilisé les localisations dans Processing, en faisant par exemple ce genre de chose, qui permet de changer de couleurs en définissant des zones :
void setup(){ size(500,500); } void draw(){ if(mouseX<200 & mouseY<200){ fill(255,0,0); ellipse(mouseX,mouseY,20,20); } if(mouseX>200 & mouseY>200){ fill(0,0,255); rect(mouseX,mouseY,20,20);} if(mouseX<200 & mouseY>200){ fill(0,255,0); rect(mouseX,mouseY,20,20);} if(mouseX>200 & mouseY<200){ fill(0,70,0); ellipse(mouseX,mouseY,20,20);} }
Mais avec la Kinect j'avoue être un peu perdue.. Comment dois-je m'y prendre ? Je peux en cas de besoin vous fournir le code que j'ai déjà fait de mon côté.
Je vous remercie d'avance.
Hors ligne
Bonsoir,
Je ne possède pas de Kinect, mais il faut tester pour chaque doigts si au moins un est dans la zone. Ensuite si c'est le cas tu peux lancer une action.
Voici un code qui pourrait fonctionner :
// import the fingertracker library // and the SimpleOpenNI library for Kinect access import fingertracker.*; import SimpleOpenNI.*; // declare FignerTracker and SimpleOpenNI objects FingerTracker fingers; SimpleOpenNI kinect; // set a default threshold distance: // 625 corresponds to about 2-3 feet from the Kinect int threshold = 625; void setup() { size(640, 480); // initialize your SimpleOpenNI object // and set it up to access the depth image kinect = new SimpleOpenNI(this); kinect.enableDepth(); // mirror the depth image so that it is more natural kinect.setMirror(true); // initialize the FingerTracker object // with the height and width of the Kinect // depth image fingers = new FingerTracker(this, 640, 480); // the "melt factor" smooths out the contour // making the finger tracking more robust // especially at short distances // farther away you may want a lower number fingers.setMeltFactor(100); } void draw() { background(255); // get new depth data from the kinect kinect.update(); // get a depth image and display it PImage depthImage = kinect.depthImage(); image(depthImage, 0, 0); // bouton noStroke(); fill(0, 255, 0); ellipse(100, 100, 100, 100); // update the depth threshold beyond which // we'll look for fingers fingers.setThreshold(threshold); // access the "depth map" from the Kinect // this is an array of ints with the full-resolution // depth data (i.e. 500-2047 instead of 0-255) // pass that data to our FingerTracker int[] depthMap = kinect.depthMap(); fingers.update(depthMap); // Verification de la presence des doigts dans la zone boolean bouton1 = false; for (int i = 0; i < fingers.getNumFingers(); i++) { PVector position = fingers.getFinger(i); if (dist(100, 100, position.x, position.y) < 50) { bouton1 = true; } } // Si un des doigts touche la zonr alors elle se colorie d'une maniere differente if (bouton1) { fill(0, 0, 255); ellipse(100, 100, 100, 100); } // iterate over all the fingers found // and draw them as a red circle noStroke(); fill(255, 0, 0); for (int i = 0; i < fingers.getNumFingers(); i++) { PVector position = fingers.getFinger(i); ellipse(position.x - 5, position.y -5, 10, 10); } // show the threshold on the screen fill(255, 0, 0); text(threshold, 10, 20); } // keyPressed event: // pressing the '-' key lowers the threshold by 10 // pressing the '+/=' key increases it by 10 void keyPressed() { if (key == '-') { threshold -= 10; } if (key == '=') { threshold += 10; } }
Hors ligne
Bonsoir Elydia,
Tu devrais pouvoir tester la proximité de l'élément tracké, en récupérant ses coordonnées avec les coordonnées du centre de la zone (si c'est une zone circulaire), avec un code du genre
if (dist( centre_zone_x, centre_zone_y, element_tracke_x, element_tracke_y ) < 20) {
// à moins de 20 pixels de distance, lancer l'action
}
A quelles données des éléments trackés as tu accès ?
Hors ligne
Mushussu : Merci beaucoup pour ta réponse. Je vais donc devoir essayer de créer mes ellipses avec le code que tu m'as présenté. J'aurais simplement une question, y a-t-il un moyen de toucher l'ellipse et que cette dernière puisse me ramener à une autre image ? Utiliser un boolean serait-ce la bonne solution ? Dans le sens où = true, loadImage numéro 2 par exemple ?
emoc : Pour l'instant j'ai simplement écrit un code qui permet de tracker mes doigts, avec comme l'a fait Mushussu la librairie FingerTracker et je n'ai pas regardé au niveau des coordonnées/données ce que cela pourrait donner, je compte le faire ce soir, comme je ne savais pas encore comment il fallait que je m'y prenne..
En tout cas, merci à vous deux je vais tester cela et voir si ça fonctionne.
Hors ligne
Je ne comprends pas exactement ce que tu souhaites faire.
Si tu n'as que deux images, l'utilisation d'un booléen est indiqué.
Pour te donner tout de suite une conseil, le fait de charger une image prend du temps(tout est est relatif) il vaut mieux charger tes deux images dans le setup dans deux variables distinctes et ensuite afficher l'image en fonction du booléen.
Hors ligne