2

我正在使用 Kinect(Microsoft 官方)的新人脸跟踪 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 的代码。

4

2 回答 2

1

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

MSDN 论坛链接

基本上,在 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 总是假的。任何的想法?

于 2012-05-25T14:37:39.530 回答
1

我终于想通了,并在 MSDN 论坛上发表了一篇关于还需要做些什么才能使其正常工作的帖子。

它在这里。

希望有帮助!

于 2012-12-18T06:33:02.807 回答