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.
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. –
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 :) –
La valeur retournée par 'Position.Z' est en mètres. –