如何锁定单个骨架

时间:2012-04-17 10:43:10

标签: c# sdk kinect

我正在使用SDK创建一个应用程序,我必须只有一个用户并将其锁定,这样如果其他人出现,即使该人更接近Kinect,应用程序也会跟踪它跟踪的第一个骨架。

从msdn库我发现我可以使用Skeletom Stream Class:

属性:AppChoosesSkeletons =获取或设置一个布尔值,该值确定应用程序是否选择要跟踪的骨架。

方法:SkeletonStream.ChooseSkeletons(Int32)=选择一个要跟踪的骨架。 语法:public void ChooseSkeletons(int trackingId1)

我不擅长编程,而且我正在使用C#,我想写下类似代码的东西,但它说我正在使用无效表达式。

SkeletonFrame SFrame = e.OpenSkeletonFrame();
if (SFrame == null) return;

Skeleton[] Skeletons = new Skeleton[SFrame.SkeletonArrayLength];
SFrame.CopySkeletonDataTo(Skeletons);

int firstSkeleton = Skeletons[0].TrackingId;
sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton);

if (firstSkeleton == null)
return;

if (SkeletonTrackingState.Tracked == firstSkeleton.TrackingState)
{
//body...

问题在于sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton,它说int firstSkeleton cannot be used
有人可以帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:3)

sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton);

你想用这条线做什么?

Imo如果你想将firstSkeleton转换成int,就像这样写:

sensor.SkeletonStream.ChooseSkeletons((int) firstSkeleton);

如果你不想抛出它而只是为了给methid赋予和int变量,只需写:

sensor.SkeletonStream.ChooseSkeletons(firstSkeleton);

答案 1 :(得分:2)

您无法锁定骨架,但无论其位置如何,您都可以选择要跟踪的骨架。当两个人都离开Kinect的视野时会变得复杂。

通过将AppChoosesSkeletons设置为true,您可以选择要跟踪的用户。要指定要跟踪的用户,请调用SkeletonStream.ChooseSkeletons方法并传递要跟踪的一个或两个骨架的跟踪ID(如果不跟踪骨架,则不传递参数)。

这样的事情:

private void ChooseSkeleton()
  {
    if (this.kinect != null && this.kinect.SkeletonStream != null)
        {
        if (!this.kinect.SkeletonStream.AppChoosesSkeletons)
        {
        this.kinect.SkeletonStream.AppChoosesSkeletons = true; // Ensure AppChoosesSkeletons is set
        }

        foreach (Skeleton skeleton in this.skeletonData.Where(s => s.TrackingState != SkeletonTrackingState.NotTracked))
        {
        int ID { get.skeleton[1]}//Get ID here
        }

      if (ID = 0)
      {
        this.kinect.SkeletonStream.ChooseSkeletons(ID); // Track this skeleton
      }
    }
  }