Kinect et migration au SDK v2

Comme je l’expliquais dans un précédent article, j’aime bien utiliser la Kinect pour faire comprendre l’importance des tests unitaires avant de passer aux tests d’intégration à mes étudiants. Ca fait deux ans que j’utilise ce TP avec une Kinect de première génération, mais j’ai reçu la V2 depuis quelque temps (je fais partie du programme beta) et de caractère joueur, je pense que je vais tenter mon prochain TP avec une version beta du SDK V2 Sourire

Mais pour cela, il va d’abord falloir faire fonctionner mon code existant sur la nouvelle API, qui a bien changé pour ce qui est de la reconnaissance de squelette. Le but du présent article est de documenter la migration.

Librairies

La librairie de base pour faire du .NET s’appelle toujours Microsoft.Kinect.dll, mais elle se trouve désormais dans C:\Program Files\Microsoft SDKs\Kinect\v2.0-PublicPreview1409\Assemblies\ (en tout cas, pour cette beta du SDK).

Attention, il faudra passer votre projet en .NET 4.5, dans l’onglet Application des propriétés du projet, pour que la librairie soit acceptée :

image

Détection des senseurs

Voici l’ancien code pour récupérer le périphérique Kinect courant (on peut en brancher plusieurs, mais dans 99% des cas, on n’en utilise qu’un) :

foreach (var potentialSensor in KinectSensor.KinectSensors)
    if (potentialSensor.Status == KinectStatus.Connected)
    {
        this.sensor = potentialSensor;
        break;
    }

L’API en nouvelle version permet de gérer beaucoup plus facilement ce cas standard :

this.kinectSensor = KinectSensor.GetDefault();

Au passage, il n’y a pas d’autres méthodes pour choisir un senseur dans cette classe, donc je ne sais pas comment on fait avec de multiples Kinect. Ca aussi, ça a changé…

Ouverture du flux

Le flux de données lié à la détection corporel s’ouvrait précédemment avec du code à peu près comme suit :

if (null != this.sensor)
{
    this.sensor.SkeletonStream.Enable();
    this.sensor.SkeletonFrameReady += this.SensorSkeletonFrameReady;
    this.sensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;
    try { this.sensor.Start(); }
    catch (IOException) { this.sensor = null; }
}

On procède désormais différemment, en utilisant un véritable flux de lecture, et plus simplement un évènement :

this.bodyFrameReader = this.kinectSensor.BodyFrameSource.OpenReader();
this.kinectSensor.Open();
this.bodyFrameReader.FrameArrived += this.Reader_FrameArrived;

Il y a donc une surcouche par rapport à l’API précédente, qui faisait lire directement le flux sur le capteur. Désormais, c’est bien une classe de type Reader qui renvoie les informations. Plus logique…

Gestion des évènements

Logiquement, la signature des méthodes appelées est bien différente. Voici l’ancienne :

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)

Et voici la nouvelle :

private void Reader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)

Les classes d’arguments étant différentes, le code pour les exploiter suit le mouvement. Dans l’ancien, on récupérait des instances de Skeleton :

using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
    if (skeletonFrame != null)
    {
        skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
        skeletonFrame.CopySkeletonDataTo(skeletons);
    }

Désormais, ce sont des instances de Body :

using (BodyFrame bodyFrame = e.FrameReference.AcquireFrame())
{
    if (bodyFrame != null)
    {
        if (this.bodies == null)
            this.bodies = new Body[bodyFrame.BodyCount];
    }
}

Changements dans les jointures

Pour les jointures (au sens du corps humain, pas SQL), on récupère toujours le contenu de Joints, avec une énumération JointType.

Attention, toutefois, car certains types de jointures ont été remplacés. Par exemple, la jointure ShoulderCenter n’existe plus. Le nouveau modèle de squelette est maintenant plus complet, et offre une description de la colonne vertébrale, ce qui nous amène à utiliser SpineShoulder à la place.

Et la suite au prochain épisode !

About JP Gouigoux

Jean-Philippe Gouigoux est Architecte Logiciel, MVP Connected Systems Developer. Il intervient régulièrement à l'Université de Bretagne Sud ainsi qu'à l'Agile Tour. Plus de détails sur la page "Curriculum Vitae" de ce blog.
This entry was posted in C# and tagged . Bookmark the permalink.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha Captcha Reload