Share via


Tracking Modes (Seated and Default)

Kinect for Windows 1.5, 1.6, 1.7, 1.8

Skeleton tracking a new modality, call seated mode for tracking user skeletons.

Hh973077.k4w_st_8(en-us,IEB.10).png

The seated tracking mode is designed to track people who are seated on a chair or couch, or whose lower body is not entirely visible to the sensor. The default tracking mode, in contrast, is optimized to recognize and track people who are standing and fully visible to the sensor.

Note

The skeletal tracking pipeline operates independently between the two tracking modes, although only one tracking mode can be active at one time. You can choose the pipeline to use and switch between modes as the pipeline operates; when you switch modes, the tracking briefly resets to track in the new mode.

Differences between Default and Seated Tracking Modes

  • The default mode tracks twenty skeletal joints, reporting their position as "tracked" or "inferred". The seated mode only tracks the ten upper-body joints (shoulders, elbows, wrists, arms and head); it reports the lower-body joints (spine, hips, knees, ankles, and feet) as "not tracked".
  • The default mode detects the user based on the distance of the subject from the background. The seated mode, instead, uses movement to detect the user and distinguish him or her from the background, such as a couch or chair.
  • To get recognized (locking) in default mode, users can just stand in front of Kinect. To get recognized and locked in seated mode, users should lean forward or move their hands or body. If a user is leaning back on a soft couch without moving, it will be hard to lock and track the user even in seated mode.
  • Default mode is not optimal to track players in a seated position; seated mode can recognize players in standing positions, but still requires some movement for initial locking.
  • The seated pipeline provides a different segmentation mask than the default pipeline:
    • Continuity of the segmentation mask is not guaranteed outside of the arms, head, and shoulder areas.
    • The seated segmentation mask doesn't correspond exactly to the player outline like the standing (full-body) mask does.
    • The seated pipeline environment has less data, with more noise and variability than the standing environment. This is because of the inherently more challenging environment of seated tracking.
    • Players that don't have skeletons are not guaranteed to have player masks from the seated pipeline.
  • The seated mode uses more resources than the default pipeline and yields a lower throughput (in frames per second) on the same scene.
    • If your application requires more frames per second and faster frame processing, using faster hardware (increasing CPU speed and/or the amount of memory) will provide better skeletal pipeline throughput for seated mode.
  • Seated mode provides the best way to recognize a skeleton when the Kinect depth sensor is in near range.

Similarities between Default and Seated Tracking Modes:

  • Both modes can track two users out of six.
  • Only one tracking mode can be used at a time. In other words, you cannot track one user in seated mode and another user in default mode using one sensor.
  • Different Kinect sensors can use different modes, if they are using different processes.
  • Toggling between default and seated mode resets skeletal tracking briefly. When the users are relocked, each tracked user will be assigned a new tracking ID.

Backward Compatibility

To ensure backward compatibility with previous releases (SDK 1.0), the default tracking mode is selected by default by a Kinect sensor. To use seated-mode tracking, you must enable it in your application.

How to control the Skeletal Pipeline Tracking Mode in C#

In managed code, you can control the skeletal pipeline tracking mode by setting the TrackingMode to SkeletonTrackingMode.Default or SkeletonTrackingMode.Seated. You can select the mode before or after calling SkeletonStream.Enable and KinectSensor.Start.

  kinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated; // Use Seated Mode

To access the current setting of the pipeline, you can read the TrackingMode again.

    
  private void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
  {
      using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) // Open the Skeleton frame
      {
          if (skeletonFrame != null && this.skeletonData != null) // check that a frame is available
          {
              skeletonFrame.CopySkeletonDataTo(this.skeletonData); // get the skeletal information in this frame
              if (kinect.SkeletonStream.TrackingMode == SkeletonTrackingMode.Seated)
              {
                  DrawSeatedSkeletons();
              }
              else 
              {
                  DrawStandingSkeletons();
              }
          }
      }
  }

How to control the Skeletal Pipeline Tracking Mode in C++

In native code (C/C++), you can switch at run-time between the seated and full-body pipelines using NuiSkeletonTrackingEnable and passing in the NUI_SKELETON_TRACKING_FLAG_ENABLE_SEATED_SUPPORT flag for seated tracking, or omitting the flag for full-body tracking. Note that NuiSkeletonTrackingEnable can be called to change the tracking mode, even if skeleton tracking was previously enabled; it is not necessary to call NuiSkeletonTrackingDisable before switching modes.

  hr = m_pNuiSensor->NuiSkeletonTrackingEnable(
    m_hNextSkeletonEvent, NUI_SKELETON_TRACKING_FLAG_ENABLE_SEATED_SUPPORT);