Kinect: Comment identifier le premier squelette suivi et faire des trucs après

Comment puis-je identifier le premier squelette du kinect suivi et ensuite faire des choses avec. Je ne suis intéressé que par le premier squelette et celui qui vient après je n’en ai pas besoin. De préférence, le prochain squelette qui entre n’est pas suivi du tout.

Quelqu’un peut m’aider avec cela merci. Actuellement, le code ci-dessous im utilise ne fonctionne pas. J’ai essayé une requête linq rapide mais je ne suis pas très sûr de savoir comment l’utiliser. Toujours avoir des erreurs avec elle.

Est-ce que quelqu’un peut me donner quelques exemples avec lesquels je peux travailler d’avance merci !!

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { Skeleton[] skeletons = new Skeleton[0]; using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null) { skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength]; skeletonFrame.CopySkeletonDataTo(skeletons); } } using (DrawingContext dc = this.drawingGroup.Open()) { // Draw a transparent background to set the render size dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight)); if (skeletons.Length != 0) { foreach (Skeleton skel in skeletons) { RenderClippedEdges(skel, dc); if (skel.TrackingState == SkeletonTrackingState.Tracked) { this.TrackingId = Skel; sensor.SkeletonStream.AppChoosesSkeletons = true; sensor.SkeletonStream.ChooseSkeletons(skel.TrackingId); this.DrawBonesAndJoints(skel, dc); if (skel == null) { Process.Start("wmplayer.exe", "C:\\Users\\User\\Downloads\\Test.wma"); } } else if (skel.TrackingState == SkeletonTrackingState.NotTracked) { sensor.SkeletonStream.AppChoosesSkeletons = false; } } } // prevent drawing outside of our render area this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(160, 0.0, RenderWidth, RenderHeight)); } } 

Vous ne pouvez suivre qu’un seul squelette avec ce morceau de code:

 int trackingID; skeletonTracked = new Skeleton(); bool first = true; Skeleton skeleton; Skeleton[] skeletons = new Skeleton[6]; ... public void AllFramesReady(object sender, AllFramesReadyEventArgs e) { using (SkeletonFrame sFrame = e.OpenSkeletonFrame()) { sFrame.CopySkeletonDataTo(skeletons); skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); if (skeleton == null) return; } using (DrawingContext dc = this.drawingGroup.Open()) { // Draw a transparent background to set the render size dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight)); RenderClippedEdges(skel, dc); if (skeleton.TrackingState == SkeletonTrackingState.Tracked) { if (first) { skeletonTracked = skeleton; trackingId = skeleton.TrackingID; ... first = false; } if (skeleton.TrackingID == trackingId) { ... } } ... } } 

Ce code trouve le premier squelette détecté. Si son ID de suivi est égal au premier détecté, vous effectuez des opérations avec lui, sinon vous n’effectuez pas d’opérations sur d’autres squelettes détectés ultérieurement. Cependant, je verrais Détecter l’utilisateur Kinect car il a d’autres méthodes pour détecter les squelettes avec des identifiants / index distincts. La méthode des identifiants permet de distinguer plusieurs joueurs, mais ils changent en grande partie pour chaque squelette. Les index sont sauvegardés pendant une courte période afin que vous puissiez avoir du code pour détecter que le squelette a quitté le cadre.

Kinect piste player et définit l’ID dans différents index du tableau Skeletons (length == 6) à chaque fois qu’il détecte le nouveau. C’est pourquoi il est nécessaire de sauvegarder l’ID du joueur lorsque le nombre d’index avec un identifiant de suivi égal à zéro est égal à 5.

  int skeletonId = 0; int trackId = 0; void myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { Skeleton[] skeletons = null; using (SkeletonFrame frame = e.OpenSkeletonFrame()) { if (frame != null) { skeletons = new Skeleton[frame.SkeletonArrayLength]; frame.CopySkeletonDataTo(skeletons); } } if (skeletons == null) return; //variable for count of null ID int skeletonsNull = 0; //counting... foreach (Skeleton skeletonText in skeletons) { if (skeletonText.TrackingId == 0) { skeletonsNull++; } else { skeletonId = skeletonText.TrackingId; } } if (skeletonsNull == 5) { trackId = skeletonId; } foreach (Skeleton skeleton in skeletons) { if (skeleton.TrackingId == trackId) { //do something }