none
Two Skeletons not tracked when they go. RRS feed

  • Question

  • Hi everyone, i have this code, it´s work with two people, but when one person or both go, and the come back or someone else use it, kinect does´t track them again

    using (SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame())
                    {
                        if (skeletonFrameData != null)
                        {
                            Skeleton[] allSkeletons = new Skeleton[skeletonFrameData.SkeletonArrayLength];
                            

                            skeletonFrameData.CopySkeletonDataTo(allSkeletons);
                           

                            /////////////////////////////////////////////////////////////////////////////////////////////// 

                            if (!PlayerOneExists || !PlayerTwoExists)
                            {
                                foreach (Skeleton sd in allSkeletons)
                                {
                                    if (sd == null || sd.TrackingState != Nui.SkeletonTrackingState.Tracked)
                                    {
                                        break;
                                    }
                                    if (!PlayerOneExists)
                                    {
                                        PlayerOneExists = true;
                                        PlayerIdOne = sd.TrackingId;
                                    }
                                    else
                                        if (!PlayerTwoExists)
                                        {
                                            PlayerTwoExists = true;
                                            PlayerIdTwo = sd.TrackingId;
                                        }  
                                } 
                            }


                            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 


                            if (PlayerOneExists)
                            {
                                var sd = (from s in allSkeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId == PlayerIdOne select s).FirstOrDefault();
                                if (sd != null)
                                {
                                    PlayerIdOne = sd.TrackingId;
                                    
                             

                                    var nuiv = sd.Joints[JointType.HandRight].ScaleTo((int)ActualWidth, (int)ActualHeight, 0.50f, 0.30f).Position;
                                    CursorPosition = new Point(nuiv.X, nuiv.Y);

                                    Nui.Joint lh = sd.Joints[Nui.JointType.HandLeft];
                                    Nui.Joint ls = sd.Joints[Nui.JointType.ShoulderLeft];

                                    bool isup = lh.Position.Y > ls.Position.Y;


                                    if (isup != _isPainting)
                                    {
                                        _isPainting = isup;

                                        if (_isPainting)
                                            MainWindow.Instance.StartPainting();
                                        else
                                            MainWindow.Instance.StopPainting();
                                        
                                    }
                                }
                                else
                                {
                                    PlayerOneExists = false;
                                    
                                    PlayerIdOne = 0;
                                }



                                if (PlayerTwoExists)
                                {
                                    var dd = (from s in allSkeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId == PlayerIdTwo select s).FirstOrDefault();
                                    if (dd != null)
                                    {

                                        PlayerIdTwo = dd.TrackingId;
                                        

                                        var nuiv = dd.Joints[JointType.HandRight].ScaleTo((int)ActualWidth, (int)ActualHeight, 0.50f, 0.30f).Position;
                                        CursorPosition2 = new Point(nuiv.X, nuiv.Y);

                                        

                                        Nui.Joint lq = dd.Joints[Nui.JointType.HandLeft];
                                        Nui.Joint le = dd.Joints[Nui.JointType.ShoulderLeft];

                                        bool isup = lq.Position.Y > le.Position.Y;


                                        if (isup != _isPainting)
                                        {
                                            _isPainting = isup;

                                            if (_isPainting)
                                                MainWindow.Instance.StartPainting();
                                            else
                                                MainWindow.Instance.StopPainting();

                                        }



                                    }
                                }
                                else
                                {
                                    PlayerTwoExists = false;
                                    
                                    
                                    PlayerIdTwo = 0;
                                }
                            }

    Thanks, and sorry for my bad english

    Thursday, January 10, 2013 4:38 PM

All replies

  • I think I see one change that you can make that might help with some error cases:

     if (!PlayerOneExists && PlayerIdTwo != sd.TrackingId)
                                    {
                                        PlayerOneExists = true;
                                        PlayerIdOne = sd.TrackingId;
                                    }
                                    else
                                        if (!PlayerTwoExists && PlayerIdOne != sd.TrackingId)
                                        {
                                            PlayerTwoExists = true;
                                            PlayerIdTwo = sd.TrackingId;
                                        }  

    This will prevent the same player from being tracked as both player one and player two.  Hope that gives you a clue to follow.


    Walt Smith Senior Architect

    Thursday, January 10, 2013 5:39 PM
  • I had a very similar issue when doing face tracking. For me using the camera setting "NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX" instead of "NUI_IMAGE_TYPE_DEPTH" did the job. This flag is set in the NuiInitialize() method.
    Friday, January 11, 2013 9:56 AM