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

Auteur : Alexandre BASTIEN.

I) TraKERS - Elments requis :

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

Vous les trouverez ici si vous le souhaitez : http://www.microsoft.com/en-us/kinectforwindows/develop/release-notes.aspx

II) TraKERS - Structure :

Dans le Front, se trouvent deux excutables "Trakers" et "Trakers_gestures", respectivement pour le trac de courbes via les coordonnes des positions des mains rcupres du Middleware et pour l'affichage des gestes dtects. Il aurait t possible de les rassembler en un programme, mais pour des raisons de clart lors de l'utilisation, j'ai prfr procder ainsi.

III) TraKERS - Utilisation :

Si le Middleware est lanc, le programme de Front lanc fait office de client, et rcupre les notifications envoyes. Dtaillons les deux programmes :

A) Trakers
Comme indiqu plus haut, il reoit et affiche les coordonnes des mains entrant dans le champ dlimit 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 dtectes.
Lorsque l'on dessine, une srie d'ellipses apparaissent  l'cran, formant des courbes.
Lorsque deux mains sont dtectes, la gauche est rouge et l'autre verte.
Si une main et une seule est dtecte, 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
Le mme masque a t appliqu dans ce programme d'affichage de notifications de gestes indiqus par le Middleware.
Le programme indique simplement dans la partie suprieure du masque s'il dtecte ou non une gesture, et s'il en dtecte une, donne le code envoy par le Middleware.

IV) Fonctionnement :

Les programmes sont dcoups en fonctions, afin de rendre leur structure plus cohrente.

Il existe deux fonctions principales sous Processing.
void setup(), qui permet d'initialiser des variables, la taille de la fentre, etc.
void draw(), qui est raffraichie constamment et sert principalement  dessiner ou faire appel aux fonctions amenes  tre appeles toutes les N ms.
Il est bien entendu possible de dessiner via des fonctions dj implmentes et prtes  l'emploi, dont la documentation se trouve ici :

http://processing.org/reference/

Ils reoivent des messages OSC de la part du Middleware. Ceux-ci sont contenus dans des objets qui sont des TuioCursors (en 3D) pour grer la position des mains et des TuioStrings (objets personnaliss, ajouts aux dll client et serveur TUIO).

Dans les programmes, les curseurs 3D sont principalement utiliss pour transmettre les coordonnes X, Y et Z (X et Y tant des pixels, et Z une distance en mtres). Les strings, quant  eux, ne vhiculent que de simples messages textuels.

Ils sont envoys par des listes prsentes 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 dfaut et port le numro du port au format int.
//On rcupre les curseurs.
Vector tuioCursorList = tuioClient.getTuioCursors();
//Si aucune main n'est repre.
if(tuioCursorList.size() <= 0)
{
	//fonction_1();
}
//Si une main est repre.
else if (tuioCursorList.size() == 1)
{
	TuioCursor cursor = (TuioCursor)tuioCursorList.elementAt(0);
	//fonctionAffiche1Main(cursor);
}
//Si c'est les 2.
else if(tuioCursorList.size() == 2)
{
	//fonctionAffiche2Mains(tuioCursorList);
}

Voici  prsent comment extraire les positions d'une main, via un tuioCursor :

//On obtient la liste des points (dplacements) du curseur TUIO.
Vector pointList = cursor.getPath();
for (int j=0;j<pointList.size();j++)
{
	//On prend chaque point pour les afficher.
	TuioPoint pt = (TuioPoint)pointList.get(j);
	//On affiche les coordonnes dans la fentre  la position (100 ; j*20), j allant de 20  N.
	text(pt.getX() + " " + pt.getY() + " " + pt.getZ(), 100, j*20+20);
	//Si deux mains sont dtectes, on quitte la fonction.
	if(tuioClient.getTuioCursors().size() == 2)
		break;
}

Il est  noter que plusieurs projets existent sous Processing, notamment dans l'affichage de fluides ou de fume 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 exprimentez des difficults ou souhaitez me soumettre une requte, voici mon adresse : alexandre.bastien@iri.centrepompidou.fr