using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using bbiwarg.Images; namespace bbiwarg.Detectors.Fingers { class FingerTracker { private FingerImage fingerImage; private List[] detectedFingers; private List trackedFingers; private int framesUntilTracked; public FingerTracker() { framesUntilTracked = 3; detectedFingers = new List[framesUntilTracked]; for (int i = 0; i < framesUntilTracked; i++) { detectedFingers[i] = new List(); } } public List getFingers() { return trackedFingers; } public void setDetectedTouchEventsThisFrame(List detectedFingersThisFrame, FingerImage fingerImage) { this.fingerImage = fingerImage; for (int i = (framesUntilTracked - 1); i > 0; i--) { detectedFingers[i] = detectedFingers[i - 1]; } detectedFingers[0] = detectedFingersThisFrame; findTrackedFingers(); } private void findTrackedFingers() { float minSimilarity = 0.75f; 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) < minSimilarity) { tracked = false; break; } } if (tracked) { fingerImage.drawLine(finger.LineSegment, FingerImageState.fingerTracked); 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; } } }