public void Update(IEnumerable<BlobsTracker.TrackedBlob> updatedBlobs) { /* Rajouter les nouveaux blobs */ foreach(var item in updatedBlobs) { if(item != null && !currentBlobs.ContainsKey(item)) currentBlobs[item] = new BlobGestureFollower(item, 10, 10, TimeSpan.FromSeconds(2), TimeSpan.FromMilliseconds(200)); } /* Retirer ceux qui sont morts, mettre à jour les autres */ var dedBlobs = new List<BlobsTracker.TrackedBlob>(); foreach (var tracked in currentBlobs) { tracked.Value.Update(); if (tracked.Value.State == Interaction.CursorState.Default) { /* Il est mort, jim ! */ dedBlobs.Add(tracked.Key); } else { /* On essaye les détections */ TryDetect(tracked.Value); } } /* Ménage */ foreach (var ded in dedBlobs) currentBlobs.Remove(ded); }
private double ComputeGestureScore(DateTime now, BlobGestureFollower follower, RecognizedGesture desiredGesture) { var sequence = follower.Sequence; if ((now - sequence.LastModificationTime) >= gestureDetectionLatency) { var machine = desiredGesture.Machine; if (sequence.Count >= machine.Descriptor.Count) { machine.Reset(); for (int i = 0; i < sequence.Count && !machine.Valid; i++) { var gesture = sequence[sequence.Count - i - 1]; if (gesture != null) { machine.Update(gesture.Gesture); } } return machine.Valid ? machine.Score : 0; } else return 0; } else return 0; }
private void TryDetect(BlobGestureFollower follower) { if (follower == null) throw new ArgumentNullException("follower"); var scoresForEachMoves = from desiredGesture in recognizedGestures select new { gesture = desiredGesture, score = ComputeGestureScore(DateTime.Now, follower, desiredGesture) }; var bestMatch = ( from match in scoresForEachMoves where match.score > 0 orderby match.score descending select match.gesture ).FirstOrDefault(); if (bestMatch != null) { follower.Sequence.Reset(); bestMatch.RaiseActivated(follower.Blob); } }