2013-03-13 1 views
4

Je sais convertir en pixels la valeur obtenue à partir de Joint.Position.X et Joint.Position.Y. Il y a un exemple dans lequel je le fais:Kinect: Convertir Joint.Position.Z en millimètres

void kinectSensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) 
     { 
      if (skeletonFrame != null) 
      { 
       Skeleton[] skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; //conterrà tutti gli skeleton 

       skeletonFrame.CopySkeletonDataTo(skeletonData); 

       Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); 

       if (playerSkeleton != null) 
       { 
        Joint rightHand = playerSkeleton.Joints[JointType.HandRight]; 
        Joint leftHand = playerSkeleton.Joints[JointType.HandLeft]; 

        //EDIT: The following formulas used to convert X and Y coordinates in pixels are wrong. 
        //Please, see the answer for details 
        rightHandPosition = new float[] { (((0.5f * rightHand.Position.X) + 0.5f) * (640)), (((-0.5f * rightHand.Position.Y) + 0.5f) * (480)) }; 
        leftHandPosition = new float[] { (((0.5f * leftHand.Position.X) + 0.5f) * (640)), (((-0.5f * leftHand.Position.Y) + 0.5f) * (480)), leftHand.Position.Z }; 
       } 
      } 
     } 
    } 

Maintenant, ce que je veux faire est d'obtenir la profondeur réelle (en millimètres) en utilisant Joint.Depth.Z. En référence à l'exemple précédent, je veux obtenir deux tableaux 3D pour rightHandPosition et leftHandPosition, avec la dernière coordonnée qui représente la profondeur. Quelle est la bonne formule pour transformer la valeur retournée de rightHand.Position.Z et leftHand.Position.Z dans la valeur correspondante en millimètres?

EDIT: Les formules utilisées pour transformer les coordonnées X et Y en pixels dans le code ci-dessus sont fausses. S'il vous plaît, lisez la réponse suivante par moi.

+1

Je ne sais rien du fonctionnement de la Kinect, mais je peux en déduire un peu de ce que vous avez posté. A en juger par ce que vous avez posté, rightHand (et leftHand) .Position vous donne une valeur 3D {x, yz,}, normalisée de 0 à 1. Donc, vous avez une coordonnée 3D. Vous avez juste besoin de l'échelle et peut-être le traduire. Quelle est la couverture de la gamme 0..1? Je suppose que c'est la limite de ce que les analyses Kinect. Pouvez-vous interroger cette information de quelque part? Si c'est le cas, il suffit de multiplier chaque dimension fois (son point final - son point de départ) et ajouter le point de départ. –

+0

J'ai posé cette question car parfois je reçois des valeurs pour Z qui sont supérieures à 1. C'est le problème ... Mais merci pour vos suggestions :) –

+0

La valeur retournée par 'Position.Z' est en mètres. –

Répondre

8

Je me suis rendu compte que Joint.Position.X et Joint.Position.Y ne sont pas limités entre -1 et 1. Cette information erronée est assez répandu sur Internet, et c'est la raison pour laquelle je répondre à moi-même.

Comme Evil Closet Monkey a mentionné, dans les commentaires ci-dessus, le official documentation dit que « coordonnées de l'espace squelette sont exprimés en mètres ». Il est également confirmé par un membre de l'équipe Kinect for Windows au this post.

Cela signifie que pour convertir les coordonnées X, Y et Z, obtenus avec Joint.Position.X, Joint.Position.Y et Joint.Position.Z, en millimètres, il vous suffit de diviser ces valeurs par 1000 (ou vous pouvez également travailler en mètres, sans conversions nécessaire).

0

Comme mentionné précédemment, les positions sont exprimées en mètres. Il suffit de multiplier par 1000 pour convertir les mètres en millimètres. Conversion According To Google

+0

Cela devrait être un commentaire. –

Questions connexes