
L'application doit être lancée avec des droits élevés. Pour éviter d'avoir à renseigner le mot de passe de l'utilisateur
sudo visudo
Dans la section "# Cmnd alias specification", ajouter
Cmnd_Alias KINECT_CMD = /chemin/vers/libfreenect2/build/bin/Protonect
A la fin du fichier, ajouter
ALL=(ALL) NOPASSWD: KINECT_CMD
Le processus peut alors être piloté depuis java
ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","sudo ./Protonect");
pb.directory(new File("/chemin/vers/libfreenect2/build/bin"));
Process p = pb.start();
// code
p.waitFor();
Une temporisation est nécessaire en cas de relance.
Chaque image de profondeur retournée par le Kinect est en 512x424 avec 4 octets par point. Chaque trame fait donc 512x424x4 = 868352 octets.
Soit en Java
val = (((int)(source[idx + 3] & 1)) << 8) + (source[idx + 2] & 0xFF);
Ce qui donne le résultat suivant
La valeur obtenue est proportionnelle à la distance. Dans la capture, plus le point est proche du capteur, plus le pixel est blanc.
Deux éléments à noter : la présence d'artéfacts à l'arrière-plan et le découpage de la main au premier plan. Ce découpage est dû au décalage entre les leds et la caméra infra-rouge du Kinect, qui entraîne la formation d'une zone d'ombre.
Les groupes sont identifiés par un entier (En pratique, un int[] sera associé au boolean[] obtenu à l'étape précédente).
Un tableau de liens permet de suivre les rattachements entre les groupes. Le lien va toujours dans le sens de l'identifiant le plus grand vers l'identifiant le plus petit. Un groupe (source) ne peut être rattaché qu'à un seul groupe (cible). Si deux liens existent pour la même source, le lien vers le plus petit identifiant est conservé. Un nouveau lien est créé entre la cible éliminée et la cible conservée.
Le parcours est réalisé ligne par ligne, de haut en bas et de gauche à droite. Pour chaque point actif :
Cette étape consiste à parcourir les liens afin de ne plus avoir que des destinations finales (Groupe cible n'étant source d'aucun lien)
Avec cette méthode, 97 groupes sont identifiés, dont la plupart ne font que quelques pixels.
De la même façon, il est possible de calculer rapidement le centre de gravité de chaque groupe.
A la fin du traitement, il ne reste que deux groupes dans l'exemple (rouge et orange). Le centre de gravité est représenté par une petite croix blanche.