Kinect: How do i ID the first tracked skeleton and do stuff with it after

人走茶凉 提交于 2019-12-02 07:58:21
Liam McInroy

You can track only one skeleton with this piece of 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)
            {
                ...
            }
        }

        ...
    }
}

This code finds the first skeleton detected, if it's tracking ID is equal to the first one detected, then you perform operations with it, otherwise you don't perform operations on other skeletons that are detected later. However, I would see Kinect user Detection as it has other methods of detecting skeletons with seperate ids/indexes. The method of IDs is great for distinguishing between multiple players, but they change largely for every skeleton. The indexes are saved for a short time so you could have some code for detecting that the skeleton left the frame.

Kinect track player and set ID in diffrent index of Skeletons array (length == 6) every time when it detects the new one. That's why is necessary to save Player's ID when number of index with tracking id equal zero is 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   
            }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!