TraKERS (Tracking using Kinect and Extracting Robust Skeletons) est une interface basée sur la détection de gestures / positions du squelette envoyé par le SDK Microsoft (1.0) de Kinect.

Auteur : Alexandre BASTIEN.

I) TraKERS - Eléments requis :

Dans cette partie, il vous faudra installer Processing, disponible ici : http://processing.org/download/

II) TraKERS - Structure :

Dans le Front, se trouvent deux principaux exécutables "Trakers" et "Trakers_gestures", respectivement pour le tracé de courbes via les coordonnées des positions des mains récupérées du Middleware et pour l'affichage des gestes détectés. Il aurait été possible de les rassembler en un programme, mais pour des raisons de clarté lors de l'utilisation, j'ai préféré procéder ainsi.

III) TraKERS - Utilisation :

Si le Middleware est lancé, le programme de Front lancé fait office de client, et récupére les notifications envoyées. Détaillons les deux programmes :

A) Trakers (composé du fichier principal et d'un fichier "TuioFunctions" gérant la réception des messages)
Comme indiqué plus haut, il reçoit et affiche les coordonnées des mains entrant dans le champ délimité par le Middleware.
Afin d'indiquer les limites de zone de dessin, un masque noir a été appliqué, et se met à jour.
Les notifications du client s'affichent en blanc en haut du masque, et indique si une ou deux mains sont détectées.
Lorsque l'on dessine, une série d'ellipses apparaissent à l'écran, formant des courbes.
Lorsque deux mains sont détectées, la gauche est rouge et l'autre verte.
Si une main et une seule est détectée, la courbe sera rouge.
Si la ou les mains s'approchent et atteignent une certaine proximité, le segment dessiné deviendra bleu à partir de ce moment-là.

B) Trakers_gestures (composé du fichier principal et d'un fichier "TuioFunctions" gérant la réception des messages)
Le même masque a été appliqué dans ce programme d'affichage de notifications de gestes indiqués par le Middleware.
Le programme indique simplement dans la partie supérieure du masque s'il détecte ou non une gesture, et s'il en détecte une, donne le code envoyé par le Middleware.

Il existe d'autres exemples au sein de cet installeur, qui seront abordés au sein du tutoriel présent dans le dossier : front_processing/doc.

IV) Fonctionnement :

Les programmes sont découpés en fonctions, afin de rendre leur structure plus cohérente.

Il existe deux fonctions principales sous Processing.
void setup(), qui permet d'initialiser des variables, la taille de la fenêtre, etc.
void draw(), qui est raffraichie constamment et sert principalement à dessiner ou faire appel aux fonctions amenées à être appelées toutes les N ms.
Il est bien entendu possible de dessiner via des fonctions déjà implémentées et prêtes à l'emploi, dont la documentation se trouve ici :

http://processing.org/reference/

Ils reçoivent des messages OSC de la part du Middleware. Ceux-ci sont contenus dans des objets qui sont des TuioCursors (en 3D) pour gérer la position des mains et des TuioStrings (objets personnalisés, ajoutés aux dll client et serveur TUIO).

Dans les programmes, les curseurs 3D sont principalement utilisés pour transmettre les coordonnées X, Y et Z (X et Y étant des pixels, et Z une distance en mètres). Les strings, quant à eux, ne véhiculent que de simples messages textuels.

Ils sont envoyés par des listes présentes dans le client TUIO.

Voici un bout de code expliquant comment obtenir la position des mains :

TuioProcessing tuioClient;
tuioClient = new TuioProcessing(host, port; //host pourrait être this par défaut et port le numéro du port au format int.
//On récupère les curseurs.
Vector tuioCursorList = tuioClient.getTuioCursors();
//Si aucune main n'est repérée.
if(tuioCursorList.size() <= 0)
{
    //fonction_1();
}
//Si une main est repéré
else if (tuioCursorList.size() == 1)
{
    TuioCursor cursor = (TuioCursor)tuioCursorList.elementAt(0);
    //fonctionAffiche1Main(cursor);
	//s'il y en a un deuxième, on l'obtient à elementAt(1)
}
//Si c'est les 2.
else if(tuioCursorList.size() == 2)
{
    //fonctionAffiche2Mains(tuioCursorList);
}

Voici à présent comment extraire la position actuelle d'une main, via un tuioCursor :

//On obtient le point actuel du curseur TUIO.
TuioPoint pt = cursor.getPosition();
//On affiche les coordonnées dans la fenêtre à la position (100 ; 20).
text(pt.getX() + " " + pt.getY() + " " + pt.getZ(), 100, 20);

Il est à noter que plusieurs projets existent sous Processing, notamment dans l'affichage de fluides ou de fumée par exemple :

http://processing.org/discourse/yabb/YaBB.cgi?board=Contribution_Simlation;action=display;num=1045166270
http://bodytag.org/nav.php?u=fluid3/
http://bodytag.org/fluid3/fluid3.pde
http://bodytag.org/nav.php?u=smoke2/
http://bodytag.org/smoke2/smoke2.pde

Si vous expérimentez des difficultés ou souhaitez me soumettre une requête, voici mon adresse : alexandre.bastien@iri.centrepompidou.fr