【问题标题】:Kinect SDK 1.5 - Face Tracking : WPF tracking problemsKinect SDK 1.5 - 人脸跟踪:WPF 跟踪问题
【发布时间】:2012-05-23 11:57:24
【问题描述】:

我正在使用 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 的代码。

【问题讨论】:

  • @OutlawLemur:已添加代码,但它是 Microsoft 提供的代码。问题是关于示例之间检测的差异,为什么即使我坐着 C++ 也会跟踪,而在 WPF 中我必须站起来?只有我遇到这种问题吗?
  • 有关跟踪模式的详细信息,请参阅SkeletonTrackingMode,特别是Seated
  • @OutlawLemur 感谢您的帮助,但不同之处在于示例中调用的程序(不同的方法)。尽管如此,我还是不明白为什么,即使传感器设置为“就座”,骨架框架仍显示“默认”作为跟踪方法。

标签: wpf kinect


【解决方案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 总是假的。有什么想法吗?

【讨论】:

    【解决方案2】:

    我终于想通了,并在 MSDN 论坛上发表了一篇文章,说明还需要做什么才能使其正常工作。

    It's here.

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多