Kinect – Getting Started

Publié par Fabrice Tavilla, le 16/10/2013, dans .NET, Valtech

Certaine personnes se demandent déjà “Mais pourquoi parler de Kinect maintenant ? Je sais ce que c’est, je connais déjà”.

Premièrement parce que certains ne connaissent toujours pas. Ceux-là nous les invitons à regarder cette courte vidéo.

Dans un deuxième temps, si beaucoup de monde connaît l’accessoire de la console, peu de gens savent qu’il est possible de l’utiliser dans des applications tierces avec de la reconnaissance de position corporelle assis ou debout, de parole, de visage, etc.

Pour finir,  sorti en version 1 en février 2012, le SDK officiel en est aujourd’hui à la version 1.8, démontrant le support offert par Microsoft sur ce produit. Parmi les nouveautés, des ajouts significatifs à l’API, le support du HTML 5 et de Kinect Fusion en font un produit toujours plus complet qui a depuis longtemps dépassé le stade de “manette”.

 

Présentation du produit

Image

Commençons par un rappel rapide sur le produit afin de mieux comprendre les fonctionnalités qu’il nous offre.

Une première caméra couleur permet de filmer… en couleur. Oui c’est une révolution. Plus sérieusement, celle-ci sera généralement utilisée de manière additionnelle aux autres capteurs.

Un émetteur infrarouge, couplé à un capteur, sert de caméra de “profondeur”. C’est la caméra 3D qui permet de cartographier la distance à laquelle se trouvent les objets placés devant le capteur. Les données brutes peuvent être utilisées mais le processeur intégré permet également de discerner 6 personnes dont 2 avec l’emplacement détaillé du squelette. Nous verrons cela dans la partie suivante.

Un microphone-array composé de 4 micros placés le long de l’appareil permet de réceptionner, localiser, isoler les sons émis face au capteur.

Enfin, un moteur permet de relever et abaisser la tête du capteur de +/- 27° afin de s’adapter au positionnement de l’appareil, sur ou sous la tv par exemple.

Et le tout pour un prix de 150€ à sa sortie dans la version “Kinect for Xbox”. Tout simplement inimaginable vu le condensé de technologie dont il regorge. Une deuxième version, un peu plus chère, du Kinect est également disponible, appelée “Kinect for Windows”.

Certaines fonctionnalités additionnelles sont disponibles sur cette seconde version. La première est de débloquer le “Near Mode” qui permet de détecter les objets de 40cm à 4m au lieu des 80cm à 4m avec le premier. La seconde est la détection des personnes assises et pas uniquement debouts. La dernière est la licence pour créer des applications commerciales.

 

Installation de l’environnement de développement.

Nous supposons que Visual Studio 2012 est déjà installé sur votre poste. Si ce n’est pas le cas, veuillez télécharger la version Express ici.

Il faut tout d’abord télécharger et installer le SDK de Kinect for Windows. Ensuite, faites de même pour le Developper Toolkit.

Ce dernier ne nous servira pas dans ce tutoriel mais vous pourrez y trouver entre autre beaucoup d’exemples d’application.

 

Objectifs et mise en œuvre du projet

Dans ce premier exercice, nous allons nous pencher sur la détection des mouvements des mains gauche et droite d’un utilisateur afin de commander une autre application en simulant les appuis sur les touches gauche et droite. Vous pourrez, par exemple, faire des présentations de vos PowerPoints sans les mains ! Enfin, avec ! Bref !

Image

 

Comment ça marche ?

La Kinect permet de récupérer des flux de données correspondants à la vidéo couleur, aux utilisateurs détectés et au son capté. Dans notre exercice, nous allons nous intéresser uniquement à la position des points spécifiques du corps humain.

Voici ces points:

JJ131025.k4w_st_joint_2(en-us,IEB.10).png

 

Ce schéma est issu de la documentation officielle de Microsoft que nous vous invitons à lire. Il représente donc les points trackés par la Kinect. Elle nous permet de savoir pour chacun de ces derniers s’il a été tracké ou bien s’il est en position seule.

Nous allons maintenant voir comment récupérer ces points et affecter un comportement à un mouvement.

 

Step 1

Créer un nouveau projet de type console

Step 2

Ajouter une référence (Clic-droit sur le projet, ajouter une référence).

Dans l’onglet “Assembly>Extensions” sélectionner “Microsoft.Kinect”

references

 Step 3

Dans le fichier Program.cs, ajouter à la liste des dépendances:

using Microsoft.Kinect;

On déclare un objet KinectSensor qui représentera notre Kinect.

static KinectSensor kinect;

Ensuite on déclare un tableau de type Skeleton qui permettra de stocker la position du squelette de la personne se trouvant devant le capteur.

private static Skeleton[] skeletons;

Pour finir, on ajoute deux booléens afin de déterminer quel type de mouvement on est en train d’appliquer: mouvement à droite ou mouvement à gauche.

static bool isForwardGestureActive;
static bool isBackGestureActive;

Step 4

Voici la méthode Main de notre application:

 static void Main(string[] args)
 {
      int exitStatus = 0;
 
      // Récupère la première kinect connectée
      kinect = KinectSensor.KinectSensors.FirstOrDefault(s => s.Status == KinectStatus.Connected);
 
      if (kinect == null)
      {
           Console.WriteLine("This application requires a Kinect sensor. Press 'ENTER' to exit.");
           Console.ReadLine();
           exitStatus = -1;
       }
       else
       {
            // Active le skeletal tracking
            kinect.SkeletonStream.Enable();
            kinect.SkeletonFrameReady += new EventHandler(kinect_SkeletonFrameReady); // Initialisation du skeleton listener
 
            kinect.Start(); // Démarre la kinect
 
            Console.WriteLine("The application is running. Open your application and make your move or press 'ENTER' to exit.");
            Console.ReadLine();
 
            StopKinect();
        }
        Environment.Exit(exitStatus);
 }

Nous allons maintenant expliquer son fonctionnement.

Premièrement, on initialise notre objet KinectSensor en recherchant la première Kinect connectée.

Si aucune Kinect n’est détectée, on ferme l’application en avertissant l’utilisateur, sinon on active le tracking de squelette et on ajoute un listener sur ce dernier.

kinect.SkeletonStream.Enable();
kinect.SkeletonFrameReady += new EventHandler(kinect_SkeletonFrameReady);

Step 5

Regardons le code du listener:

 private static void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
 {
      using (var skeletonFrame = e.OpenSkeletonFrame())
      {
           if (skeletonFrame == null)
           return;
 
           if (skeletons == null ||
                    skeletons.Length != skeletonFrame.SkeletonArrayLength)
           {
               skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
           }
 
           skeletonFrame.CopySkeletonDataTo(skeletons);
       }
 
       Skeleton closestSkeleton = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)
                                            .OrderBy(s => s.Position.Z * Math.Abs(s.Position.X))
                                            .FirstOrDefault();
 
       if (closestSkeleton == null)
       return;
 
       var head = closestSkeleton.Joints[JointType.Head];
       var rightHand = closestSkeleton.Joints[JointType.HandRight];
       var leftHand = closestSkeleton.Joints[JointType.HandLeft];
 
       if (head.TrackingState == JointTrackingState.NotTracked ||
           rightHand.TrackingState == JointTrackingState.NotTracked ||
           leftHand.TrackingState == JointTrackingState.NotTracked)
       {
           //Nous n'avons pas une bonne lecture des jointures donc nous n'effectuons aucun traitement
           return;
       }
 
       MoveSlide(head, rightHand, leftHand);
 
 }
Pour chaque frame reçue, nous allons instancier un objet Skeleton. Ensuite, nous récupérons tous les points qui ont été trackés. Enfin, nous récupérons les positions des deux mains et de la tête. Nous vérifions que ces derniers ont bien été trackés et dans ce cas-là, nous appelons notre méthode MoveSlide().

 

Step 6

La méthode MoveSlide calcule pour chaque main s’il y a eu mouvement et effectue le passage d’un slide à l’autre si besoin.

La méthode utilisée n’est autre que le mapping des touches “Flèche de droite” et “Flèche de gauche” du clavier.

Voici le code:

 private static void MoveSlide(Joint head, Joint rightHand, Joint leftHand)
 {
      if (rightHand.Position.X > head.Position.X + 0.45)
      {
          if (!isForwardGestureActive)
          {
             isForwardGestureActive = true;
             Console.WriteLine("Right move");
             System.Windows.Forms.SendKeys.SendWait("{Right}");
           }
       }
       else
       {
           isForwardGestureActive = false;
       }
 
       if (leftHand.Position.X < head.Position.X - 0.45)
       {
           if (!isBackGestureActive)
           {
                isBackGestureActive = true;
                Console.WriteLine("Left move");
                System.Windows.Forms.SendKeys.SendWait("{Left}");
            }
        }
        else
        {
            isBackGestureActive = false;
        }
 }

Ici, nous testons si pour chaque main nous avons eu un mouvement à hauteur de la tête. Ensuite nous envoyons un signal au système d’exploitation afin d’émuler l’utilisation de la flèche de droite ou de gauche.

Step 7

Pour terminer, il faut stopper la Kinect proprement. Pour cela, nous appelons deux méthodes: Stop() et Dispose().

   private static void StopKinect()
   {
       if (kinect != null)
       {
           kinect.Stop();
           kinect.Dispose();
           kinect = null;
       }
    }

La méthode Stop() permet d’arrêter le flux de récupération de données que reçoit la Kinect. Dispose(), quant à elle, libère la mémoire et termine tous les flux de données.

Conclusion:

Nous avons voulu montré au travers de cet article que, grâce au SDK fourni par Microsoft, vous pouvez développer de petites applications sympas en quelques lignes.

Notre but est de faire découvrir le développement sur Kinect et d’en présenter ses principaux aspects. Nous avons vu concrètement comment recevoir et utiliser les informations que les capteurs nous renvoient.

Bien évidement ce petit programme n’est qu’un POC. Nous n’avons pas, par exemple, utilisé tous ce qui concerne la détection de la voix.

De nouvelles fonctionnalités seront bientôt disponibles avec l’arrivée de la Kinect 2 et du SDK 2.0. En attendant, nous vous laissons vous amuser avec ce petit programme que vous pouvez trouver sur notre GitHub ! :)

Michaël FERY et Fabrice TAVILLA

 

 

 

 

3 retours sur “Kinect – Getting Started”

  1. David Nonnenmacher says:

    C’est possible d’utiliser la kinect avec un autre OS – Linux par exemple ?

  2. Michael Fery says:

    Avant la publication du SDK officiel par Microsoft, de nombreux développeurs se sont “amusés” à créer des drivers pour Windows mais également pour Linux et MacOS. Une des premières bibliothèques opensource que j’ai utilisé était OpenKinect. Elle fonctionnait déja trés bien à l’époque et continue à vivre. Regarde donc de ce côté là : http://openkinect.org/

  3. Steve VALENTIN says:

    Article super intéressant, merci et bonne continuation!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

By submitting this form, you accept the Mollom privacy policy.