123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- 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<Finger>[] detectedFingers;
- private int framesUntilTracked;
- public List<Finger> TrackedFingers { get; private set; }
- public FingerTracker()
- {
- framesUntilTracked = Constants.FingerNumFramesUntilTracked;
- detectedFingers = new List<Finger>[framesUntilTracked];
- TrackedFingers = new List<Finger>();
- for (int i = 0; i < framesUntilTracked; i++)
- {
- detectedFingers[i] = new List<Finger>();
- }
- }
- public void setDetectedTouchEventsThisFrame(List<Finger> 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<Finger>();
- 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;
- }
- }
- }
|