Kinect SDK 1.5 - 面部跟踪:WPF跟踪问题

时间:2012-05-23 11:57:24

标签: wpf kinect

我正在使用Kinect(微软官方)的新面部跟踪SDK,我注意到c ++和c#-wpf之间的检测存在差异:第一个在识别方面比第二个更快(一个我想用,实际上)。在c ++版本中,面部跟踪几乎是在飞行中,而在wpf中它只在我将整个身体(整个骨架)放在Kinect的FOV中时开始。

有没有人发现原因?我注意到提供的骨架显示了属性“Trackingmode = default”,即使我将kinect骨架流设置为就位。

colorImageFrame.CopyPixelDataTo(this.colorImage);
depthImageFrame.CopyPixelDataTo(this.depthImage);
skeletonFrame.CopySkeletonDataTo(this.skeletonData);

// Update the list of trackers and the trackers with the current frame information
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;
          }
    }
}

代码是我的微软提供的1.5 SDK。

2 个答案:

答案 0 :(得分:1)

我在其他论坛上有一些信息,特别是在这里(感谢这个人(blog)):

MSDN forum link

基本上,在c ++示例中,使用了跟踪面部的所有方法,颜色+深度和颜色+深度+骨架,而在c#中仅使用后者。所以只有你站起来才会开始。

我做了一些测试,但另一种方法仍然不适合我,我对代码做了一些修改但没有运气。这是我的修改:

internal void OnFrameReady(KinectSensor kinectSensor, ColorImageFormat colorImageFormat, byte[] colorImage, DepthImageFormat depthImageFormat, short[] depthImage)
        {
            if (this.faceTracker == null)
            {
                try
                {
                    this.faceTracker = new Microsoft.Kinect.Toolkit.FaceTracking.FaceTracker(kinectSensor);
                }
                catch (InvalidOperationException)
                {
                    // During some shutdown scenarios the FaceTracker
                    // is unable to be instantiated.  Catch that exception
                    // and don't track a face.
                    //Debug.WriteLine("AllFramesReady - creating a new FaceTracker threw an InvalidOperationException");
                    this.faceTracker = null;
                }
            }

            if (this.faceTracker != null)
            {
                FaceTrackFrame frame = this.faceTracker.Track(
                    colorImageFormat,
                    colorImage,
                    depthImageFormat,
                    depthImage,
                    Microsoft.Kinect.Toolkit.FaceTracking.Rect.Empty);
                    //new Microsoft.Kinect.Toolkit.FaceTracking.Rect(100,100,500,400)); 

                this.lastFaceTrackSucceeded = frame.TrackSuccessful;
                if (this.lastFaceTrackSucceeded)
                {
                    if (faceTriangles == null)
                    {
                        // only need to get this once.  It doesn't change.
                        faceTriangles = frame.GetTriangles();
                    }

                    this.facePointsProjected = frame.GetProjected3DShape();

                    this.rotationVector = frame.Rotation;
                    this.translationVector = frame.Translation;
                    this.faceRect = frame.FaceRect;
                    this.facepoints3D = frame.Get3DShape();
                }
            }
        }

frame.TrackSuccessful始终为false。有什么想法吗?

答案 1 :(得分:1)

我终于想通了,并在MSDN论坛上发帖说明还需要做些什么来实现这个目标。

It's here.

希望有所帮助!