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]); }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (faceTracker != null) { faceTracker.Dispose(); faceTracker = null; } if (kinect != null) { kinect.Stop(); kinect = null; } }
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(); }
public void Dispose() { faceTracker.Dispose(); }