Techdays 2012 : démos C# avancé et coding4fun

08/02/2012 8 commentaires

Bonjour à tous,

Ce fut un très grand plaisir de participer encore un fois aux Techdays. Il a eu bien sûr Coding4Fun mais aussi C# avancé qui fut un grand moment. Je n’ai pas posté beaucoup depuis que j’ai ouvert ce blog à part quelques articles sur Kinect ici et , c’était donc  très sympa de repartager à nouveau avec vous.

A noter que des solutions comme le canvas infini et le framework de navigation basé sur async proviennent de réels projets développés dans le cadre de Sensorit. (je dis ça pour les taquins qui disent que je ne code que des démos !)

 

  • C# avancé : dont le principal sujet a été l’écriture d’un petite framework de navigation basé sur Async et permettant de centraliser tous les efforts de navigation à un seul endroit ou comment faire tenir toute une application dans le Loaded Smile

image

 

  • Coding4Fun

Le Canvas infini dont voici un screenshot hyper parlant !!

image

 

Et Arkanoid dans l’éditeur de code Wpf de Visual Studio, l’année prochaine ça va être vraiment très dur d’en faire un nouveau !

image

 

Pour ceux qui ont raté ou veulent revoir Coding4Fun la session est déjà en ligne car elle était diffusé en live: http://tdtv.microsoft.fr/j1/Live.aspx#fbid=t6BuyaYrGlX (dernier repère de la timeline)

Voici intégralité des sources dans un dossier skydrive.

Mitsu

Publicités
Catégories :Uncategorized Étiquettes : ,

Kinect: reconnaissance de la main en 3D

12/11/2011 3 commentaires

Dans mon précédent post nous avions utilisé une analyse 2D de la main afin d’enrichir les capacités de gestures. Etudions désormais une analyse 3D.

L’image de profondeur de Kinect renvoie un tableau en x et y de valeurs de profondeur. La méthode SkeletonEngine.SkeletonToDepthImage() du SDK Kinect permet de convertir chacune de ces coordonnées et profondeurs en coordonnées 3D (x,y,z) dans le repère de la caméra (x=0 et y=0 lorsque l’on est dans l’axe de la caméra). On est donc capable relativement facilement de récupérer une collection de points 3D (nuage de points).

Etudions une première problématique qui n’est déjà pas si simple : la recherche de plans.

Si pour l’œil humain il parait évident de reconnaitre lorsqu’une collection de points 3D rassemble à peu près les points d’un même plan, mathématiquement c’est un tout autre problème.

Il existe bon nombre de technologies de reconstruction 3D depuis des images 2D. Ce sont les technologies qui sont utilisées en réalité augmentée ou dans des logiciels tels que Photosynth. Les images 2D n’étant finalement que des collections de points de couleurs, ces algorithmes étudient les variations de couleurs, recherchent à détecter les bordures (ruptures de couleurs) et les lignes de fuite.

Dans l’analyse de nuages de points, nous sommes déjà dans un environnement 3D mais la recherche de surface est tout aussi complexe car il faut déduire les points qui sont potentiellement en « contact », segmenter les zones trouvées et enfin reconstruire les surfaces, rechercher des surfaces pour être plus exact (fitting).

Il existe un excellent projet open source sur le sujet que je vous recommande : http://pointclouds.org/

Vous trouverez également sur le net pas mal de littérature sur le sujet.

Dans notre cas, nous allons simplifier le problème car nous ne cherchons qu’une seule chose, le plan de la main et en plus nous avons un point de vue.

Pour sélectionner uniquement les points de la main, j’ai utilisé la même technique que dans l’article précédent.

La recherche du plan :

Pour simplifier les explications, posons-nous la même problématique en 2D : nous avons un nuage de points 2D à peu près alignés dans le plan et nous recherchons la droite qui représente au mieux cet ensemble.

Il existe une méthode d’approximation qui s’appelle la méthode des moindres carrés. (http://fr.wikipedia.org/wiki/M%C3%A9thode_des_moindres_carr%C3%A9s )

image

Sans trop entrer dans les détails, l’idée est de partir d’une droite quelconque passant par le centre de gravité du nuage de points et de calculer la sommes des écarts au carré de chacun des points par rapport à sa projection sur la droite. Le but est ensuite de minimiser cette valeur pour se rapprocher de la droite idéale.

Le calcul de minimum n’est pas simple car il faut faire une régression linéaire pour y parvenir. Notons que ça se complique bien plus encore si le modèle recherché est plus complexe qu’une droite (système non linéaire) ou si l’on veut définir des pondérations aux différents points.

J’ai adapté ces notions à notre cas et en le simplifiant pour la 3D.

Pour notre main, nous recherchons donc un plan. Pour rappel son équation cartésienne est a.x + b.y + c.z + d = 0.

Géométriquement parlant, un plan est caractérisé par son vecteur normal. L’idée est alors de calculer pour tous les triplets de points adjacents, le vecteur normal du plan qu’ils décrivent et de chercher à minimiser l’écart (l’angle) avec le vecteur normal du plan.

L’usage de Kinect simplifie une chose essentielle : nous avons un point de vue !

En effet, le nuage de points n’est pas juste une collection de points 3D quelconque, nous savons qu’il est issu de la vision d’une caméra. On peut en déduire des informations importantes :

– Il n’y a pas de points non visibles à la caméra (par exemple je ne peux pas avoir de points appartenant à mon dos si je suis face à la caméra).

– La recherche des points « adjacents » est aisée puisqu’il suffit de vérifier qu’ils sont voisins dans l’image de profondeur et que leur écart de profondeur ne dépasse pas un certain seuil.

– Le calcul de chaque plan élémentaire renvoie un vecteur normal qui peut être vers ou opposé à la caméra suivant l’ordre des 3 points choisis (règle de la main droite). Connaissant le point de vue de la caméra, il suffit de changer le signe du vecteur s’il est opposé à la caméra.

J’ai ajouté une petite option à cet algorithme qui est de conserver l’écart type des écarts ! Cela me permet alors de savoir lors du calcul du plan de la main si celle-ci est très à plat ou pas. Je considère même qu’au-delà un certain seuil mon plan n’est pas valide car la main n’est pas assez plate.

Voilà c’est à peu près tout. Au final le calcul est tout de même conséquent mais assez rapide et c’est le prix à payer pour faire une analyse basée sur les informations de profondeur.

Ci-dessous, le résultat en vidéo.

Catégories :Kinect

Kinect: reconnaissance de la main avec OpenCV

10/11/2011 7 commentaires

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

Offre de stage

Bonjour à tous,

Sensorit, société spécialisée dans le développement d’interactions naturelles, recherche stagiaire en développement.

La durée est de 11 mois dès que possible mais vous pouvez postuler pour une durée inférieure.

Le stage porte sur le développement de dispositifs divers et variés avec l’équipe Sensorit.

Technologies utilisées : WPF/Silverlight/ Xaml, .Net, C#.

Des connaissances sur Kinect, Html5 ou Windows phone 7 sont des plus, Windows 8 sera surement de la partie.

Merci de me contacter directement.

Mitsuru FURUTA – cto Sensorit
mitsufu@sensorit.fr

Catégories :Uncategorized

Au revoir Microsoft…

Spectateurs

Je ne sais pas trop par où commencer…

Le 3 mars 2003, je rejoins Microsoft France pour un poste de relations techniques avec les développeurs et l’ambition de faire adopter la plate-forme .Net au plus grand nombre. Je ne suis jamais allé à une conférence Microsoft de ma vie. A l’époque, les blogs n’existent pas, les réseaux sociaux non plus. Nous écrivons des articles sur msdn et nous parcourons la France plusieurs fois par an pour présenter les nouveautés. L’évènement annuel majeur rassemblant les développeurs s’appelle alors les DevDays.

8 ans plus tard, j’ai beaucoup appris sur l’évènementiel, sur la communication, sur Microsoft et évidemment sur .Net. Les années se sont succédées à vitesse grand V, toutes différentes, au rythme des versions de produit.

La technologie est une passion que j’ai adoré partager avec vous. J’ai rencontré un nombre incroyable de développeurs, de partenaires, de clients. J’ai participé et organisé bon nombre de conférences, enregistré des heures de webcasts, animé des quizz sur mon blog !
Les mercredis du développement, les sessions C# ou encore Coding for fun, les Msdays, les évènements partenaires et les fêtes qui suivaient sont tout autant de souvenirs incroyables que j’ai pu partager avec vous tous et je vous en remercie.

De manière plus personnelle mon plus grand souvenir restera surement d’avoir eu l’occasion d’écrire quelques lignes de code dans le version 3.5 du framework .Net lors d’une mission à Corp.

Je ne peux partir sans faire un clin d’oeil aux partenaires et communautés que j’ai cotoyés: Nicolas Clerc, Rédo, Bernard et Christine, David et Yann de Bewise, Michel Perfetti, les Mvps ou encore certains que j’ai connus étudiants comme Thomas, Simon, Johanna.

C’est aujourd’hui vers un nouveau défi que je me tourne. Je rejoins mon ami de longue date Dick Lantim que vous connaissez peut-être, pour une nouvelle aventure technologique et humaine à laquelle je n’ai pas su résister.
La société s’appelle Sensorit et est spécialisée dans les interactions numériques disruptives.

Mercredi dernier (15 décembre) j’animais ma dernière conférence en tant que microsoftee sur la programmation asynchrone aux cotés de Bruno Boucard.
J’animerai tout de même 4 sessions au prochain TechDays parisien de février.

Merci pour tout, à bientôt et au plaisir de vous recroiser sur ce nouveau blog ou ailleurs.

Mitsu

mailto://mitsufu@sensorit.fr/
http://twitter.com/mitsufu
https://mitsufu.wordpress.com/

Catégories :Uncategorized