using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using bbiwarg.Images; using bbiwarg.Graphics; namespace bbiwarg.Recognition.FingerRecognition { class FingerTracker { private OutputImage outputImage; private List[] detectedFingers; private int framesUntilTracked; public List TrackedFingers { get; private set; } public FingerTracker() { framesUntilTracked = Constants.FingerNumFramesUntilTracked; detectedFingers = new List[framesUntilTracked]; TrackedFingers = new List(); for (int i = 0; i < framesUntilTracked; i++) { detectedFingers[i] = new List(); } } public void setDetectedTouchEventsThisFrame(List detectedFingersThisFrame, OutputImage outputImage) { this.outputImage = outputImage; for (int i = (framesUntilTracked - 1); i > 0; i--) { detectedFingers[i] = detectedFingers[i - 1]; } detectedFingers[0] = detectedFingersThisFrame; findTrackedFingers(); } private void findTrackedFingers() { TrackedFingers = new List(); foreach (Finger finger in detectedFingers[0]) { bool tracked = true; Finger mostSimilarLastFrame = finger; for (int i = 1; i < framesUntilTracked; i++) { Finger mostSimilarThisFrame = getMostSimilarFingerInFrame(mostSimilarLastFrame, i); if (mostSimilarThisFrame == null || mostSimilarLastFrame.getSimilarity(mostSimilarThisFrame) < Constants.FingerMinSimilarityForTracking) { tracked = false; break; } } if (tracked) { outputImage.drawLineSegment(finger.LineSegment, Constants.FingerTrackedColor); TrackedFingers.Add(finger); } } } private Finger getMostSimilarFingerInFrame(Finger finger, int frame) { Finger mostSimilarFinger = null; float maxSimilarity = 0; foreach (Finger f in detectedFingers[frame]) { float similarity = finger.getSimilarity(f); if (similarity > maxSimilarity) { mostSimilarFinger = f; maxSimilarity = similarity; } } return mostSimilarFinger; } } }