了解Kinect Facetracker.track()方法

时间:2017-03-03 06:47:51

标签: c# kinect kinect-sdk

我正在使用Kinect v1和SDK 1.8。我需要将数据传递给faceTracker.Track()方法。

但是track()的构造函数在结尾处询问了Skeleton参数。 但是不能直接将骨架数据带到骨架对象上。它提供数据阵列。

如何根据请求的跟踪方法将数据传递给此faceTracker.Track()方法?

以下是我尝试的方式。

using (SkeletonFrame skeletonFrame = allFramesReadyEventArgs.OpenSkeletonFrame())
{
    if (skeletonFrame != null && this.skeletonData != null) // check that a frame is available
    {
        skeletonData = new Skeleton [newSensor.SkeletonStream.FrameSkeletonArrayLength];
        skeletonFrame.CopySkeletonDataTo(this.skeletonData); // get the skeletal information in this frame
        this.skeletonData = new Skeleton[this.newSensor.SkeletonStream.FrameSkeletonArrayLength];    
    }
}

跟踪方法

 if (faceTracker == null)
 {
     try
     {
         faceTracker = new FaceTracker(sensorChooser.Kinect);
     }
     catch (InvalidOperationException)
     {
         //write something
     }

     if (faceTracker != null)
     {
         FaceTrackFrame frame = faceTracker.Track(
            sensorChooser.Kinect.ColorStream.Format,
            colorImageData, 
            sensorChooser.Kinect.DepthStream.Format, 
            colorPixels, 
            skeletonData);
      }
  } 

我将Skeleton [] skeletonData ;定义为此

以下是Kinect SDK中提供的跟踪方法

 public FaceTrackFrame Track(
            ColorImageFormat colorImageFormat, 
            byte[] colorImage, 
            DepthImageFormat depthImageFormat, 
            short[] depthImage, 
            Skeleton skeletonOfInterest)
        {
            return this.Track(colorImageFormat, colorImage, depthImageFormat, depthImage, skeletonOfInterest, Rect.Empty);
        }

1 个答案:

答案 0 :(得分:0)

foreach (Skeleton skeleton in this.skeletonData)
                {
                    if (skeleton.TrackingState == SkeletonTrackingState.Tracked
                        || skeleton.TrackingState == SkeletonTrackingState.PositionOnly)
                    {
                        // We want keep a record of any skeleton, tracked or untracked.
                        if (!this.trackedSkeletons.ContainsKey(skeleton.TrackingId))
                        {
                            this.trackedSkeletons.Add(skeleton.TrackingId, new SkeletonFaceTracker());
                        }

                        // Give each tracker the upated frame.
                        SkeletonFaceTracker skeletonFaceTracker;
                        if (this.trackedSkeletons.TryGetValue(skeleton.TrackingId, out skeletonFaceTracker))
                        {
                            skeletonFaceTracker.OnFrameReady(this.Kinect, colorImageFormat, colorImage, depthImageFormat, depthImage, skeleton);
                            skeletonFaceTracker.LastTrackedFrame = skeletonFrame.FrameNumber;
                        }
                    }
                }

我在kinect toolkit 1.8项目FaceTrackingBasics-WPF应用程序的帮助下解决了上述问题。