Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2016-11-27 21:10:10 Kinect/Processing

Elydia
nouveau membre
Date d'inscription: 2016-03-02
Messages: 3

Kinect/Processing



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

 

#2 2016-11-27 22:00:52 Re : Kinect/Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Kinect/Processing



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

 

#3 2016-11-27 22:04:37 Re : Kinect/Processing

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Kinect/Processing



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

 

#4 2016-12-01 11:38:42 Re : Kinect/Processing

Elydia
nouveau membre
Date d'inscription: 2016-03-02
Messages: 3

Re: Kinect/Processing



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

 

#5 2016-12-03 10:53:02 Re : Kinect/Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Kinect/Processing



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

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024