12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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<Finger>[] detectedFingers;
- private List<Finger> trackedFingers;
- private int framesUntilTracked;
- public FingerTracker() {
- framesUntilTracked = 3;
- detectedFingers = new List<Finger>[framesUntilTracked];
- for (int i = 0; i < framesUntilTracked; i++)
- {
- detectedFingers[i] = new List<Finger>();
- }
- }
- public List<Finger> getFingers() {
- return trackedFingers;
- }
- public void setDetectedTouchEventsThisFrame(List<Finger> 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<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) < minSimilarity)
- {
- tracked = false;
- break;
-
- }
- }
- if (tracked)
- {
- fingerImage.drawLine(finger.Line, 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;
- }
- }
- }
|