Browse Source

fignertraker init

Alexander Hendrich 10 years ago
parent
commit
4bdf187a5a

+ 6 - 64
bbiwarg/Recognition/FingerRecognition/FingerTracker.cs

@@ -11,77 +11,19 @@ namespace bbiwarg.Recognition.FingerRecognition
 {
     class FingerTracker
     {
-        private OutputImage outputImage;
-        private List<Finger>[] detectedFingers;
-        private int framesUntilTracked;
-        public List<Finger> TrackedFingers { get; private set; }
+        public List<TrackedFinger> 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>();
-            }
+            TrackedFingers = new List<TrackedFinger>();
         }
 
-        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();
-        }
+        public void updateTrackedFingers(List<Finger> detectedFingers) {
+            Dictionary<TrackedFinger, Finger> assignments = new Dictionary<TrackedFinger, Finger>();
 
-        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;
-                }
+            foreach (TrackedFinger tf in TrackedFingers) {
+                Finger bestFit = tf.findBestFit()
             }
-            return mostSimilarFinger;
         }
     }
 }

+ 69 - 0
bbiwarg/Recognition/FingerRecognition/TrackedFinger.cs

@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace bbiwarg.Recognition.FingerRecognition
+{
+    public enum TrackingState
+    {
+        None,
+        Detected,
+        Tracked,
+        Lost,
+    }
+
+    class TrackedFinger
+    {
+        public List<Finger> Fingers { get; private set; }
+        public List<TrackingState> States { get; private set; }
+        public Finger CurrentFinger { get { return Fingers[Fingers.Count - 1]; } }
+        public TrackingState CurrentState { get { return States[States.Count - 1]; } }
+
+
+        public TrackedFinger(Finger finger)
+        {
+            Fingers = new List<Finger>();
+            States = new List<TrackingState>();
+
+            Fingers.Add(finger);
+            States.Add(TrackingState.Detected);
+        }
+
+        public void addFinger(Finger finger)
+        {
+            TrackingState previousState = CurrentState;
+            TrackingState newState = TrackingState.None;
+            int numFramesSinceInState = getNumFramesSinceInState(previousState);
+
+            if (finger == null)
+                newState = TrackingState.Lost;
+            else if (previousState == TrackingState.Tracked)
+                newState = TrackingState.Tracked;
+            else if (previousState == TrackingState.Detected)
+            {
+                if (numFramesSinceInState == Constants.FingerNumFramesUntilTracked)
+                    newState = TrackingState.Tracked;
+                else
+                    newState = TrackingState.Detected;
+            }
+
+            Fingers.Add(finger);
+            States.Add(newState);
+        }
+
+        public int getNumFramesSinceInState(TrackingState state)
+        {
+            int count = 0;
+            for (int i = States.Count - 1; i >= 0; i++)
+            {
+                if (States[i] == state)
+                    count++;
+                else
+                    break;
+            }
+            return count;
+        }
+    }
+}

+ 1 - 1
bbiwarg/VideoHandle.cs

@@ -169,7 +169,7 @@ namespace bbiwarg
 
             //track fingers
             Timer.start("fingerTracking");
-            fingerTracker.setDetectedTouchEventsThisFrame(fingerDetector.Fingers, OutputImages[1]);
+            fingerTracker.updateTrackedFingers(fingerDetector.Fingers);
             Timer.stop("fingerTracking");
 
             //detect hands