void TrackFace()
        {
            var skeleton = skeletonData
                           .Where(s => s.TrackingState != SkeletonTrackingState.NotTracked)
                           .OrderBy(s => s.Position.Z)
                           .FirstOrDefault();

            IsSkeletonTrackedUpdated(skeleton != null);

            if (skeleton == null)
            {
                skeletonId = -1;
                if (faceTracker != null)
                {
                    faceTracker.Dispose();
                    faceTracker = null;
                }

                JawLowerUpdated(null);
                return;
            }

            if (skeletonId != skeleton.TrackingId)
            {
                try
                {
                    if (faceTracker != null)
                    {
                        faceTracker.Dispose();
                    }
                    faceTracker = new FaceTracker(sensor);
                }
                catch (InvalidOperationException)
                {
                    return;
                }
            }
            skeletonId = skeleton.TrackingId;

            if (skeleton.TrackingState != SkeletonTrackingState.Tracked)
            {
                JawLowerUpdated(null);
                return;
            }

            // MEMO: FaceTrackFrame オブジェクトの Dispose メソッドを呼び出すと、以降の処理が正常に続かなくなります。
            var faceFrame = faceTracker.Track(sensor.ColorStream.Format, colorImage, sensor.DepthStream.Format, depthImage, skeleton);

            if (!faceFrame.TrackSuccessful)
            {
                JawLowerUpdated(null);
                return;
            }

            var animationUnits = faceFrame.GetAnimationUnitCoefficients();

            JawLowerUpdated(animationUnits[AnimationUnit.JawLower]);
        }
예제 #2
0
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (faceTracker != null)
            {
                faceTracker.Dispose();
                faceTracker = null;
            }

            if (kinect != null)
            {
                kinect.Stop();
                kinect = null;
            }
        }
예제 #3
0
        private async Task FaceTrackingAsync(TimeSpan dueTime, TimeSpan interval, CancellationToken token)
        {
            if (interval.TotalMilliseconds == 0)
            {
                return;
            }

            // Initial wait time before we begin the periodic loop.
            if (dueTime > TimeSpan.Zero)
            {
                await Task.Delay(dueTime, token);
            }

            DateTime    LocalTimestamp = Timestamp;
            FaceTracker tracker        = new FaceTracker(Sensor);

            // Repeat this loop until cancelled.
            while (!token.IsCancellationRequested)
            {
                // Skip already work with given data
                if (Timestamp == LocalTimestamp)
                {
                    await Task.Delay(interval, token);

                    continue;
                }

                // Timestamp data
                LocalTimestamp = Timestamp;
                FaceTrackWatch.Again();

                // Do Job
                try {
                    CopyColorData = true;
                    CopySkeletons = true;
                    FPoints       = null;
                    Mood          = 0;
                    if (null != GestureManager && null != GestureManager.Skeleton)
                    {
                        FaceTrackFrame frame = tracker.Track(ColorFormat, ColorData, DepthFormat, DepthData, GestureManager.Skeleton);
                        if (frame.TrackSuccessful)
                        {
                            // Only once.  It doesn't change.
                            if (FTriangles == null)
                            {
                                FTriangles = frame.GetTriangles();
                            }
                            FPoints = frame.GetProjected3DShape();
                            Mood    = frame.GetAnimationUnitCoefficients()[AnimationUnit.LipCornerDepressor];
                            WSRProfileManager.GetInstance().UpdateMood(Mood);
                        }
                    }
                }
                catch (Exception ex) {
                    WSRConfig.GetInstance().logError("FACE", ex);
                }
                FaceTrackWatch.Stop();

                // Wait to repeat again.
                if (interval > TimeSpan.Zero)
                {
                    await Task.Delay(interval, token);
                }
            }

            // Dispose Tracker
            tracker.Dispose();
        }
예제 #4
0
 public void Dispose()
 {
     faceTracker.Dispose();
 }