Université du SI 2011.
En décembre 2010 soit quelques mois après la commercialisation de la Kinect, PrimeSense (la société détentrice du brevet d’un des principaux capteurs) a mis à disposition des développeurs un kit de développement Open-Source (OpenNI/NITE – Natural Interaction) permettant à chacun de tirer partie des capacités du Kinect.
En juin 2011, Microsoft lance son SDK Kinect officiel (en version beta) incluant les pilotes pour PC et des librairies de reconnaissance de forme. Pour l’instant la licence Kinect interdit le développement d’applications commerciales. Cette contrainte pourrait changer prochainement avec notamment l’introduction d’un magasin en ligne (type App Store ou Marketplace) permettant aux utilisateurs de télécharger facilement de nouvelles applications utilisant la Kinect.
PrimeSense collabore actuellement avec Asus pour mettre au point un produit similaire à la Kinect de Microsoft : le Wavi X-tion (dont la sortie est prévue fin 2011). Ce produit sera principalement destiné au monde des PC et potentiellement des TV connectés. Le Wavi profitera du SDK OpenNI de PrimeSense et de l’importante communauté de développeurs qui s’était créée à l’arrivée de la Kinect.
J’ai mentionné en introduction l’expression « Interfaces Utilisateurs Naturelles ». Le mot « naturel » désigne les interfaces utilisateurs pouvant s’utiliser sans apprentissage et sans modification du schéma de pensée de l’utilisateur.
Un clavier et une souris peuvent sembler naturels à utiliser mais il faut en réalité un nombre important d’heures de pratique (rappelez-vous vos débuts devant un ordinateur) pour acquérir la dextérité nécessaire à une utilisation facile. Ce type de périphériques requiert l'emploi de symboles et de métaphores (ex: icône d'une disquette pour sauvegarder un fichier) qui détourne l’attention de l’utilisateur du contenu qu'il veut manipuler.
Une interface naturelle se doit donc d’avoir une prise en main immédiate et de pouvoir même s’effacer du point de vue utilisateur au profit de l’interaction en tant que telle.
Plusieurs périphériques plus ou moins récent entrent dans cette définition. Il y a entre autres les interfaces tactiles multi-point (telles que l’iPad ou la table Surface), les interfaces immersives (la Kinect et les lunettes d’immersion 3D) et les logiciels de commande vocale. Il est possible d’étendre la définition pour y inclure les périphériques contenant des capteurs de mouvement (accéléromètre, gyroscope) telle que la manette Nintendo Wii qui permet une compréhension immédiate de son mode d’interaction.
Il est évident que les années qui arrivent verront fleurir de nouveaux périphériques encore plus immersifs et naturels.
Laissons les réflexions ergonomiques et concentrons-nous sur la fameuse Kinect.
La Kinect est composée de :
Le capteur de profondeur est le composant principal de la Kinect car il fournit l’essentiel des informations permettant la reconnaissance de formes et mouvements. Voici le résumé du brevet détenu par la société israélienne PrimeSense décrivant la technologie de mesure de profondeur :
L'invention concerne un système et une méthode à utiliser pour reconstruire un objet. […] L'unité d'éclairage comprend une source lumineuse cohérente et un générateur de motifs de granulation aléatoire […] projetant sur l'objet le motif de granulation. L'unité d'imagerie de l'invention est conçue pour détecter […] un décalage du motif sur l'objet par rapport à l’image de référence du motif. Ceci permet une reconstruction en temps réel d'une carte tridimensionnelle de l'objet.
En bon français, un émetteur infrarouge projette un motif prédéfini (nuage de points) dans la pièce. Le capteur infrarouge détecte la moindre altération dans la réflexion de ce motif et en déduit la distance des objets de la pièce. Il est ainsi possible d’obtenir une représentation de la position en 3 dimensions des objets dans le champ de vision de la Kinect (60° horizontalement et sur une distance de 1 à 4 mètres).
Capture des flux venant des capteurs | |
<br><br>Flux video | <br><br>Flux profondeur |
Il est à noter que le capteur infrarouge est parasité par les rayons du soleil (émettant aussi de l'infrarouge). l'usage de la Kinect en extérieur est donc limité.
Et pour le matériel, c’est tout ! La partie que l’on pourrait appeler « intelligente » (détection des objets et des mouvements) s'exécute au niveau de l’ordinateur.
A partir des informations des capteurs, le kit de développement (SDK) fourni par Microsoft permet de détecter jusqu’à 4formes humaines. 2 types de tracking sont disponibles : le tracking passif et le tracking actif.
Reconnaissance de squelette | |
<br><br>Flux video | <br><br>Squelette détecté |
Le fait d’avoir dissocié les parties capture (matériel) et reconnaissance (logiciel) rend la Kinect très polyvalente et évolutive puisqu’indépendante de l’usage que l’on veut en faire.
Il est ainsi possible de ne pas utiliser la détection de squelettes du SDK et de faire soi-même les algorithmes et traitement d’images permettant la reconnaissance de formes. Certains projets indépendants permettent d’ores et déjà la reconnaissance individuelle des doigts, des traits du visage, d’animaux, d’objets variés.
Les prérequis pour le développement d’une application utilisant la Kinect sont assez faibles :
Le reste des compétences requises est directement lié au type d’application que vous souhaitez réaliser. Si l’application doit permettre la manipulation en 3D d’objets, il faudra savoir utiliser des technologies de rendu graphique 3D tels que OpenGL, DirectX ou XNA. Une application de reconnaissance de mouvement nécessitera de maitriser un minimum les algorithmes mathématiques de lissage, interpolation ou traitement du signal.
Techniquement (attention il va y avoir du code C#), le SDK est simple à utiliser.
L’initialisation de la Kinect se fait en quelques lignes :
kinectRuntime = new Runtime();
kinectRuntime.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);
Il faut ensuite indiquer à la Kinect de commencer l’acquisition des flux venant des capteurs :
kinectRuntime.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
kinectRuntime.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
Le SDK fournit 2 méthodes différentes de récupération des informations de la Kinect : par évènement ou à la demande (polling).
Le modèle évènementiel permet de s’abonner à des évènements VideoFrameReady, DepthFrameReady ou SkeletonFrameReady qui seront notifiés dès qu’une « frame » est disponible.
protected override void Initialize()
{
[…]
kinectRuntime.VideoFrameReady += new EventHandler(kinectRuntime_VideoFrameReady);
kinectRuntime.SkeletonFrameReady += new EventHandler(kinectRuntime_SkeletonFrameReady);
[…]
}
void kinectRuntime_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
{
byte[] bitmapData = e.ImageFrame.Image.Bits;
RenderToScreen(videoFrame);
[…]
}
void kinectRuntime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
if (e.SkeletonFrame.Skeletons.Count() > 0)
{
HandleGestures(skeletonFrame);
[…]
}
}
Ce modèle est utile pour le traitement asynchrone ou les applications multithread. En pratique, si les traitements que vous souhaitez effectuer pour chaque « frame » sont longs ou complexes, le modèle évènementiel risque de déclencher trop souvent votre algorithme et de provoquer une saturation du CPU.
Le modèle par polling permet d’obtenir sur demande explicite une frame (méthode GetNextFrame) et de passer à la suite si aucune frame n’est disponible dans un délai imparti.
ImageFrame videoFrame = kinectRuntime.VideoStream.GetNextFrame(timeout);
// videoFrame.Image.Bits est un byte[]
RenderToScreen(videoFrame.Image.Bits);
SkeletonFrame skeletonFrame = kinectRuntime.SkeletonEngine.GetNextFrame(timeout);
HandleGestures(skeletonFrame);
Ce modèle peut générer un code très procédurale et monolitique. Il faut donc l’utiliser avec précaution.
A titre d'exemple, j'ai développé en quelques heures un prototype permettant d'extraire une forme humaine et de l'incruster dans un décor quelconque. Voici une vidéo de démonstration:
<iframe src="http://www.youtube.com/embed/PFbycNdnJW4" frameborder="0" width="420" height="345"></iframe>
En consultant le source complet (disponible sur le site Immersive Virtualpostcard with Kinect, vous verrez que la partie la plus complexe consiste à faire l'incrustation d'image (parcours de tableau d'octets) et non de récupérer les flux du Kinect.
La reconnaissance de mouvements types (appelés gestures) comme « écarter les bras », « lever la main », « pencher sur la droite » sont à implémenter par le développeur à partir des informations du squelette.
Le SDK fournit jusqu’à 30 fois par seconde une mise à jour des squelettes détectés sous forme d’objet SkeletonFrame.
Cet objet contient les informations de positionnement des squelettes détectés ainsi que des informations sur la qualité de la détection (exacte, inférée…)
public sealed class SkeletonFrame
{
[...]
public SkeletonFrameQuality Quality;
// vecteur indiquant la gravité réelle pour corriger la déformation dûe à l'inclinaison de la Kinect
public Vector FloorClipPlane;
// liste de squelettes détectés
public SkeletonData[] Skeletons = new SkeletonData[6];
}
public sealed class SkeletonData
{
[...]
// précision du tracking : None, PositionOnly, Tracked (squelette entier)
public SkeletonTrackingState TrackingState;
public int TrackingID;
// position 3D globale
public Vector Position;
// tableau indiquant la position 3D de chaque jointure et la précision (Inferred, Tracked)
public JointsCollection Joints;
}
A partir de ces informations, il est possible de tester des règles/seuils simples définissant de mouvements, par exemple exécuter une fonction particulière lorsque l'utilisateur a la main sur la tête:
SkeletonFrame skeletonFrame = kinectRuntime.SkeletonEngine.GetNextFrame(timeout);
Vector distance =
skeletonFrame.Skeletons[0].Joints[JointID.HandRight].Position
- skeletonFrame.Skeletons[0].Joints[JointID.Head].Position;
// vérification de la position de la main par rapport à la tête
if ( // la main est placée au-dessus du niveau de la tête
distance.Y > 0
// la distance latérale entre la main et la tête est inférieure à 10cm
Math.Abs(distance.X) < 10
// la distance en profondeur entre la main et la tête est inférieure à 10cm
Math.Abs(distance.Z) < 10 )
{
LaunchRocket();
}
Plusieurs frameworks (tels que NITE de PrimeSense, BeTheController) existent pour faciliter cette tâche mais il vous faudra évaluer au cas par cas leur pertinence en fonction de votre besoin (reconnaissance de formes, suivi d’objets, précision, fiabilité…).
Je vous conseille de consulter le blog de David Cahute de Microsoft et surtout l'article sur la reconnaissance de gestures Kinect basée sur l'apprentissage : Gestures & Kinect. David a publié sous licence MIT le code du projet Kinect Toolbox qui inclut la reconnaissance de gestures, de poses et de la voix.
Voici une liste (non-exhaustive) de ressources sur la Kinect et les différents projets dans le domaine des NUI :
D'autres articles paraîtront sur le blog Octo sur les usages possibles de la Kinect pour l'entreprise.
Maintenant que le fonctionnement de la Kinect n'a plus de secret pour vous, comment comptez-vous en tirer partie ? La Kinect, la table Surface, l'iPad... forment un ensemble de technologies améliorant l'expérience utilisateur et pouvant décupler la productivité à condition d'être correctement utilisées. Par exemple (et sans vouloir rentrer dans un débat de religion), il est possible de dire que l'iPad a réussi là où les TabletPC des années 2000 ont échoué en ne voulant qu'ajouter un périphérique (écran tactile) aux usages de l'ordinateur. L'iPad s'est basé sur une refonte profonde des paradigmes d'ergonomie (navigation, accès à l'information, présentation...) et a permis l'apparition de nouveaux usages et nouveaux besoins.
De même pour la Kinect ou Surface, plusieurs grandes entreprises parmi nos clients font appel à nous pour notre expertise technologique dans le domaine mais aussi afin de les aider à inventer leurs usages de demain en B2C ou même B2E avec notamment le développement de la gamification (serious gaming pour l'évaluation/monitoring, la formation/training, la prévention...).
N'hésitez pas à partager vos expériences ou vos questions dans les commentaires, nous ne manquerons pas d'y répondre.