Mesurer la taille d’une personne à l’aide de Kinect

J’essaie de calculer la taille d’une personne à l’aide de Kinect. Voici comment je calcule la hauteur (ce code n’est pas très sophistiqué, c’est seulement pour des tests):

double h2s = Math.Sqrt(Math.Pow(headX - shoulderCenterX, 2) + Math.Pow(headY - shoulderCenterY, 2)+ Math.Pow(headZ - shoulderCenterZ, 2)); double s2hip = Math.Sqrt(Math.Pow(shoulderCenterX - hipX, 2) + Math.Pow(shoulderCenterY - hipY, 2) + Math.Pow(shoulderCenterZ - hipZ, 2)); double hip2Lhip = Math.Sqrt(Math.Pow(hipX - hipLeftX, 2) + Math.Pow(hipY - hipLeftY, 2) + Math.Pow(hipZ - hipLeftZ, 2)); double Lhip2kneeL = Math.Sqrt(Math.Pow(hipLeftX - kneeLeftX, 2) + Math.Pow(hipLeftY - kneeLeftY, 2) + Math.Pow(hipLeftZ - kneeLeftZ, 2)); double kneeL2ankle = Math.Sqrt(Math.Pow(kneeLeftX - ankleLeftX, 2) + Math.Pow(kneeLeftY - ankleLeftY, 2) + Math.Pow(kneeLeftZ - ankleLeftZ, 2)); double heigth = h2s + s2hip + hip2Lhip + Lhip2kneeL + kneeL2ankle; vyskatextbox.Text = heigth.ToSsortingng(); 

Je ne reçois aucune erreur, mais le fait est que ma taille est mal calculée. Les chiffres vont de 3 à 11, cela dépend de ma proximité avec Kinect. Quel pourrait être le problème? Est-il possible que le nombre change ou doit-il restr le même? Aussi, pourquoi ai-je des chiffres comme 11 (m)?

Je vois un shoulderCenter dans votre code, vous utilisez donc probablement le SDK Microsoft Kinect v1.x. Dans ce cas, les articulations squelettiques sont les suivantes:

Articulations squelettiques Kinect SDK v1.x

Estimation de la hauteur dans Microsoft Kinect SDK version 1.x

Supposons que nous ayons une fonction permettant de calculer la distance entre deux articulations. Nous appelons cette fonction d(joint1, joint2) .

Supposons également que nous ayons défini une fonction permettant de calculer le point moyen entre deux articulations (notez que ce qui suit n’est qu’un pseudocode):

 function avg(joint1, joint2) { avg_joint.x = (joint1.x + joint2.x) / 2.0; avg_joint.y = (joint1.y + joint2.y) / 2.0; avg_joint.z = (joint1.z + joint2.z) / 2.0; return avg_joint; } 

Un bon algorithme pour estimer la taille de l’utilisateur peut être le suivant (notez qu’il ne s’agit que d’un pseudocode):

 torso_height = d(HEAD, SHOULDER_CENTER) + d(SHOULDER_CENTER, SPINE) + d(SPINE, HIP_CENTER) + d(HIP_CENTER, avg(HIP_RIGHT, HIP_LEFT)); left_leg_height = d(HIP_LEFT, KNEE_LEFT) + d(KNEE_LEFT, ANKLE_LEFT) + d(ANKLE_LEFT, FOOT_LEFT); right_leg_height = d(HIP_RIGHT, KNEE_RIGHT) + d(KNEE_RIGHT, ANKLE_RIGHT) + d(ANKLE_RIGHT, FOOT_RIGHT); tot_height = torso_height + (left_leg_height + right_leg_height) / 2.0; 

Si toutes les articulations sont bien suivies , cet algorithme fonctionne plutôt bien. Cependant, il est possible (et cela se produit assez souvent) que certaines articulations soient déduites . Dans cette page de la documentation sur MSDN , vous pouvez voir comment vérifier si des articulations sont déduites en C #.

Si une articulation est déduite, les possibilités que sa position soit erronée augmentent. Ainsi, les possibilités d’échec de l’estimation de la hauteur augmentent également.

La méthode suivante peut être utilisée pour vérifier si toutes les articulations sont bien suivies. Elle retourne false si au moins une liaison n’est pas bien suivie; sinon, cela retourne true :

 function areJointsWellTracked(JointCollection joints) { foreach (Joint joint in joints) if(joint.TrackingState != JointTrackingState.Tracked) return false; return true; } 

Donc, ce que vous pouvez faire pour améliorer l’estimation de la hauteur de l’utilisateur, c’est de la calculer UNIQUEMENT lorsque toutes les articulations sont bien suivies.

De plus, considérez la possibilité de toujours fournir la moyenne de plusieurs des dernières valeurs de hauteur. Par exemple, vous pouvez mémoriser les dix dernières valeurs de hauteur dans un tableau, puis fournir à chaque fois la moyenne de ces valeurs. Cela aidera à réduire l’effet du bruit dans vos mesures.

Ton problème

Votre code semble être une version simplifiée de l’algorithme que je viens de décrire. La seule raison pour laquelle vous pouvez obtenir ces valeurs étranges est que le suivi ne fonctionne pas bien. Ma suggestion est d’essayer d’utiliser la méthode susmentionnée areJointsWellTracked et d’estimer la hauteur uniquement lorsque toutes les articulations sont bien suivies.

Note complémentaire pour Microsoft Kinect SDK v2

Pour les développeurs utilisant SDK v2, notez que les articulations squelettiques ne sont pas définies comme dans SDK v1.x. L’image suivante montre cette différence:

Articulations squelettiques Kinect SDK v2

En raison des différences de positions et de définitions de certaines articulations, l’algorithme ci-dessus d’évaluation de la hauteur doit être modifié comme suit:

 torso_height = d(HEAD, NECK)+ d(NECK, SPINE_SHOULDER) + d(SPINE_SHOULDER, SPINE_MID) + d(SPINE_MID, SPINE_BASE) + d(SPINE_BASE, avg(HIP_RIGHT, HIP_LEFT)); left_leg_height = d(HIP_LEFT, KNEE_LEFT) + d(KNEE_LEFT, ANKLE_LEFT) + d(ANKLE_LEFT, FOOT_LEFT); right_leg_height = d(HIP_RIGHT, KNEE_RIGHT) + d(KNEE_RIGHT, ANKLE_RIGHT) + d(ANKLE_RIGHT, FOOT_RIGHT); tot_height = torso_height + (left_leg_height + right_leg_height) / 2.0; 

Vous pouvez trouver une discussion intéressante sur la façon d’évaluer la hauteur de l’utilisateur avec Microsoft Kinect SDK v2 à ce lien .

ce lien m’a été utile.
Trouver la hauteur de l’utilisateur avec précision