Forráskód Böngészése

added fixed ID-pool to fingerTracker

Alexander Hendrich 10 éve
szülő
commit
57cb3c9da8

+ 4 - 3
bbiwarg/Constants.cs

@@ -41,13 +41,13 @@ namespace bbiwarg
         public static readonly int FingerMaxSize = 30;
         public static readonly int FingerMinSize = 5;
         public static readonly int FingerNumSlicesForRelativeDirection = FingerRemoveNumSlicesForCorrection;
-        public static readonly int FingerNumFramesUntilTracked = 5;
-        public static readonly int FingerNumFramesUntilLost = 20;
         public static readonly int FingerOutSliceFactor = 10;
         public static readonly int FingerContourMargin = 2;
         public static readonly int FingerSliceOverlapFactor = 2;
         public static readonly int FingerCrippleOutFactor = 8;
         public static readonly int FingerCrippleOutMinDifference = 15;
+        public static readonly int FingerNumFramesUntilTracked = 5;
+        public static readonly int FingerNumFramesUntilLost = 20;
         public static readonly float FingerMinSimilarityForTracking = 0.1f;
 
         // hand detection
@@ -91,9 +91,10 @@ namespace bbiwarg
         public static readonly Color FingerSliceColor = Color.Magenta;
         public static readonly Color FingerDetectedColor = ColorDetected;
         public static readonly Color FingerTrackedColor = ColorTracked;
-        public static readonly Color FingerTipOutSliceColor = Color.Orange;
+        public static readonly Color FingerTipOutSliceColor = Color.Gray;
         public static readonly Color FingerHandOutSliceColor = Color.DarkSlateGray;
         public static readonly Color FingerContourColor = Color.Red;
+        public static readonly Color FingerIDColor = Color.Orange;
 
         public static readonly Color TouchEventDetectedColor = ColorDetected;
         public static readonly Color TouchEventTrackedColor = ColorTracked;

+ 16 - 5
bbiwarg/Recognition/FingerRecognition/FingerHistory.cs

@@ -16,7 +16,7 @@ namespace bbiwarg.Recognition.FingerRecognition
 
     class FingerHistory
     {
-        private static int nextID = 1;
+        private static List<int> usedIDs = new List<int>();
         public int ID { get; private set; }
         public List<Finger> Fingers { get; private set; }
         public List<TrackingState> States { get; private set; }
@@ -27,8 +27,7 @@ namespace bbiwarg.Recognition.FingerRecognition
 
         public FingerHistory(Finger finger)
         {
-            ID = FingerHistory.nextID;
-            FingerHistory.nextID++;
+            ID = FingerHistory.getNextUnusedID();
 
             Fingers = new List<Finger>();
             States = new List<TrackingState>();
@@ -38,6 +37,10 @@ namespace bbiwarg.Recognition.FingerRecognition
             LastFinger = finger;
         }
 
+        ~FingerHistory() {
+            FingerHistory.setIDUnused(ID);
+        }
+
         public void addFinger(Finger finger)
         {
             TrackingState previousState = CurrentState;
@@ -76,8 +79,16 @@ namespace bbiwarg.Recognition.FingerRecognition
             return count;
         }
 
-        public static void resetNextID() {
-            FingerHistory.nextID = 1;
+        public static int getNextUnusedID() {
+            int id = 1;
+            while (usedIDs.Contains(id))
+                id++;
+            usedIDs.Add(id);
+            return id;
+        }
+
+        public static void setIDUnused(int id) {
+            usedIDs.Remove(id);
         }
     }
 }

+ 14 - 8
bbiwarg/Recognition/FingerRecognition/FingerTracker.cs

@@ -26,7 +26,6 @@ namespace bbiwarg.Recognition.FingerRecognition
         {
             FingerHistories = new List<FingerHistory>();
             Fingers = new List<Finger>();
-            FingerHistory.resetNextID();
         }
 
         public void updateTrackedFingers(List<Finger> detectedFingers, OutputImage outputImage)
@@ -47,12 +46,7 @@ namespace bbiwarg.Recognition.FingerRecognition
             }
 
             drawFingers(outputImage);
-            foreach (FingerHistory fh in FingerHistories) {
-                if (fh.CurrentFinger != null) {
-                    Finger f = fh.CurrentFinger;
-                    outputImage.drawText(f.HandPoint.IntX, f.HandPoint.IntY, "#" + fh.ID, Color.Red);
-                }
-            }
+            drawFingerIDs(outputImage);
         }
 
         private void updateHistories(List<Finger> detectedFingers)
@@ -93,6 +87,7 @@ namespace bbiwarg.Recognition.FingerRecognition
             //add null finger to TrackedFingers that haven't found a match in this frame (status tracked->lost)
             foreach (FingerHistory fh in unasignedFingerHistories)
             {
+                if (Constants.VerboseFingerTracker && fh.CurrentState != TrackingState.Lost) Console.WriteLine("Finger #" + fh.ID + " lost");
                 fh.addFinger(null);
             }
 
@@ -148,7 +143,7 @@ namespace bbiwarg.Recognition.FingerRecognition
                 if (fh.CurrentState == TrackingState.Lost && fh.getNumFramesInCurrentState() >= Constants.FingerNumFramesUntilLost)
                 {
                     FingerHistories.RemoveAt(i);
-                    if (Constants.VerboseFingerTracker) Console.WriteLine("Finger #" + fh.ID + " lost");
+                    if (Constants.VerboseFingerTracker) Console.WriteLine("Finger #" + fh.ID + " deleted");
                 }
             }
         }
@@ -160,5 +155,16 @@ namespace bbiwarg.Recognition.FingerRecognition
                 finger.draw(outputImage, true);
             }
         }
+
+        private void drawFingerIDs(OutputImage outputImage) {
+            foreach (FingerHistory fh in FingerHistories)
+            {
+                if (fh.CurrentFinger != null)
+                {
+                    Finger f = fh.CurrentFinger;
+                    outputImage.drawText(f.TipPoint.IntX, f.TipPoint.IntY, fh.ID.ToString(), Constants.FingerIDColor);
+                }
+            }
+        }
     }
 }