2

私は Kinect (Microsoft 公式) の新しい顔追跡 SDK を使用していますが、c++ と c#-wpf の例では検出に違いがあることに気付きました: 最初のものは 2 番目のものよりも認識がはるかに高速です (私がしたいもの)実際に使用します)。C++ バージョンでは、フェイス トラッキングはほぼオンザフライですが、wpf バージョンでは、Kinect の FOV に体全体 (つまり、スケルトン全体) を配置したときにのみ開始されます。

誰かが理由を知りましたか?kinect スケルトン ストリームを着座に設定したにもかかわらず、提供されたスケルトン フレームに "Trackingmode = default" プロパティが表示されていることに気付きました。

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 フォーラムに投稿しました。

ここです。

それが役立つことを願っています!

于 2012-12-18T06:33:02.807 に答える
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 は常に false です。何か案が?

于 2012-05-25T14:37:39.530 に答える