Loupe

[Kinect 2] Utiliser la source Body Index

Dans un précédent article, nous voyions comment utiliser la camera de profondeur et ces applications, dont l’une pouvait consister en la reconnaissance d’objets ou de forme présents devant l’objectifs. Une méthode améliorée et fournie par le SDK consiste en l’utilisation de la source de données Body Index. Cette source de données va s’utiliser comme les précédentes, à ceci près qu’elle ne servira à afficher que les pixels d’un body, soit le corps d’un utilisateur se trouvant devant le capteur.

Principe général

Ce type de source de données permettra la mise en place de scénarios tel le green screening aussi connu sous le nom de background removal. Cette technique couramment utilisée dans le monde de l’audiovisuel vise à ne faire apparaitre à l’écran final que les pixels des personnes (ou objets) qui sont filmées devant une surface verte. Pour cela, l’image produite sera traitée informatiquement pour remplacer les pixels de la surface verte par une autre image.

Avec la Kinect, nul besoin de demander aux utilisateurs de se placer devant une surface unie et de réaliser le traitement manuellement. En effet le propre de la Kinect est de détecter les corps des utilisateurs se trouvant devant le capteur et de permettre d’exploiter les coordonnées ainsi déterminées. Le travail est donc entièrement assuré par le capteur.

Afficher une frame Body Index

Dans le cas de la source de données Body Index, il suffit de parcourir les tableaux de pixels obtenus de la même manière que les sources de données vu jusqu’ici. Les valeurs possibles sont des entiers, normalement compris entre 0 et 5. La valeur 0 signifie que les coordonnées du pixel actuel se trouvent sur le corps du premier utilisateur. Les valeurs supérieures à 5, à l’inverse indique à quel utilisateur le pixel fait référence (la caméra pouvant en détecter jusque 6 différents).

Toujours selon la même base que dans les articles précédents, nous pouvons adapter le code afin de produire un affichage simple.

Pour ouvrir le flux, il faudra utiliser BodyIndexFrameSource :

using (var reader = sensor.BodyIndexFrameSource.OpenReader())

Le tableau bufferSource sera maintenant un tableau de byte :

var bufferSource = new byte[(int)(frameDesc.LengthInPixels)];

Comme précédemment, obtenir les données de la frame se fera ainsi :

frame.CopyFrameDataToArray(bufferSource);

Il suffira ensuite de parcourir le tableau et de choisir le pixel final à afficher dans streamConverted :

const int imax = 5; 
for (var i = 0; i < bufferSource.Length; ++i)
{
    if (bufferSource[i] > imax)
    {
        streamConverted.WriteByte(byte.MaxValue);
        streamConverted.WriteByte(byte.MinValue);
        streamConverted.WriteByte(byte.MinValue);
    }
    else
    {
        streamConverted.WriteByte(byte.MinValue);
        streamConverted.WriteByte(byte.MaxValue);
        streamConverted.WriteByte(byte.MinValue);
    }
}

L’exemple précédent affichera le corps vert sur fond bleu des utilisateurs présents devant la Kinect. Une amélioration possible serait d’assigner une couleur prédéfinies à chaque valeur de body index, afin de faire ressortir les corps et de pouvoir déterminer visuellement lesquels sont à l’avant ou l’arrière.

Nous verrons dans l’article suivant comment améliorer cet exemple et remplacer les pixels verts par ceux de la caméra infrarouge, ce qui nous approchera d’un scénario abouti de green screening.

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus