Accueil > Kinect > Kinect: reconnaissance de la main avec OpenCV

Kinect: reconnaissance de la main avec OpenCV

Le Ms Kinect SDK offre par défaut une API de reconnaissance du squelette. On peut bien évidemment baser un moteur de gesture sur ces informations. Le problème est souvent de pouvoir distinguer le début d’une gesture et ainsi de la dissocier des autres mouvements naturels de l’utilisateur. Afin de limiter les conflits, on peut bien évidemment utiliser d’autres interfaces comme la voix par exemple, en parallèle de la reconnaissance du squelette. Toujours dans cette optique il est très tentant d’enrichir la reconnaissance de Kinect avec une analyse de la main. De telles fonctionnalités n’existant pas dans le SDK Kinect (ni OpenNI d’ailleurs), il faut les implémenter.

Il y a plusieurs possibilités :

  • Capturer l’image vidéo (rgb) comme on le ferait avec une webcam classique et faire de l’analyse 2D afin d’analyser la main. OpenCv est une des librairies les plus répandues pour l’analyse en “computer vision”. Ce système, relativement classique n’exploite donc pas les informations de profondeur. Utilisant la caméra rgb classique de la Kinect, ce système est donc sensible à la luminosité ambiante et sera très perturbé par .
  • Utiliser l’image de profondeur. C’est une projection 2D des valeurs de profondeur dans l’espace de vision de la camera infra-rouge. Ce système ne renvoie aucune information sur la luminosité ou la coloration. Il a cependant un énorme avantage qui est la facilité pour détourer les éléments. Il est ensuite possible de reconstruire une image de la main et d’utiliser OpenCV afin de l’analyser. C’est la solution que nous étudierons ici.
  • Une dernière solution est de convertir les informations de l’image de profondeur en une collection de points 3D (x, y, z) dans le repère du squelette et d’en faire l’analyse.

Même si le système de reconnaissance final est une analyse 2D, nous allons tout de même profiter des informations de profondeur pour faciliter le détourage de l’image.

Première étape donc, isoler la main. L’analyse du squelette par le SDK Kinect nous renvoie la position des mains dans un espace 3D. Via le SDK toujours, nous avons une possibilité de retrouver les coordonnées 2D de l’image de profondeur correspondant à notre main. Encadrons la main dans un rectangle de taille cohérente et nous optenons l’image ci-dessous, qui sera toujours centrée autour de notre main. Notons que la coloration que vous voyez résulte du calcul d’un histogramme de couleur symbolisant la profondeur.

image

L’étape suivante est très simple, nous allons conserver uniquement les points dont la profondeur est proche de celle du point de la main, ignorant le reste. L’analyse 2D qui suivra s’appuiera principalement sur une recherche de contour, les différences de profondeur des points sélectionnés ne nous intéressent donc pas. Nous ne conserverons donc qu’une image noir et blanc, les points sélectionnés…ou pas.

image

L’image d’entrée pour OpenCV est donc totalement épurée. Sans entrer trop dans les détails, nous recherchons dans un premier temps un détourage grossier que nous affinerons ensuite. Nous finirons par être capable de compter le nombre de doigts tendus.

image

Cette technique à tout de même un coup non négligeable en CPU. De plus, contrairement à l’image vidéo, l’image de profondeur vibre beaucoup et à surtout des effets de trainée lorsque la main se déplace (ex: les doigts ont tendance à se “fusionner” lorsque la main se déplace rapidement), rendant l’analyse hasardeuse.
Nous avons été obligé d’appliquer à nos résultats un filtrage prédictif associé à la vitesse de déplacement afin de les stabiliser.

Ci-dessous, une petite illustration vidéo dans laquelle une seul doigt tendu simule un click.

Pour plus d’informations sur Sensorit : www.sensorit.fr

Catégories :Kinect
  1. Mathieu
    27/03/2012 à 15:50

    Salut mitsufu,

    Je viens d’acheter la kinect for windows, j’ai créer un projet WPF et j’ai reussi à afficher l’image RGB et l’image en profondeur de la kinect côte à côte.

    Maintenant j’aimerais utiliser openCV pour filtrer ces images avant de les afficher avec Erode et Dilate.

    Donc j’ai ajouter les références « Emgu.CV », « Emgu.CV.UI » et « Emgu.util » afin de pouvoir utiliser la fonction « CvInvoke.cvErode() ».

    Mais puisque j’utilise la fonction « BitmapSource.Create » pour obtenir mes images, je recois le message d’erreur suivant:
    Cannot convert from ‘System.Windows.Controls.Image’ to ‘System.IntPtr’

    Aurais-tu une idée pour résoudre ce problème ?

  2. Zhen
    26/04/2013 à 11:06

    Bonjour,

    je n’arrive pas à configurer opencv avec openni sur cmake, qui peut m’aider svp?

  1. 10/11/2011 à 17:58
  2. 12/11/2011 à 02:44
  3. 07/01/2012 à 00:37
  4. 08/02/2012 à 16:13

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :