Browse Source

improvements to fingerTracker

Alexander Hendrich 10 years ago
parent
commit
fa22854678

+ 7 - 4
bbiwarg/Constants.cs

@@ -10,12 +10,15 @@ namespace bbiwarg
     class Constants
     {
         // BBIWARG
-        public static readonly bool OutputTimerEnabled = false;
-        public static readonly bool sendingSystemTimeEnabled = true;
         public static readonly int OutputNumImages = 5;
         public static readonly int OutputNumImagesPerRow = 3;
         public static readonly float OutputScaleFactor = 1f; // output window size is scaled by this factor (from necessary size for images)
 
+        // debug
+        public static readonly bool OutputTimerEnabled = false;
+        public static readonly bool VerboseTUIO = false;
+        public static readonly bool VerboseFingerTracker = true;
+
         // confidence image
         public static readonly int ConfidenceImageMinThreshold = 500;
 
@@ -78,8 +81,8 @@ namespace bbiwarg
         public static readonly float TouchProcessNoise = 3.0e-4f;
 
         // colors
-        public static readonly Color ColorDetected = Color.Green;
-        public static readonly Color ColorTracked = Color.LightGoldenrodYellow;
+        public static readonly Color ColorDetected = Color.Turquoise;
+        public static readonly Color ColorTracked = Color.Yellow;
 
         //public static readonly Color EdgeColor = Color.Blue; // edgeImage draw direct to blue chanel from outputImage
 

+ 18 - 0
bbiwarg/Recognition/FingerRecognition/Finger.cs

@@ -6,6 +6,7 @@ using System.Text;
 using System.Threading.Tasks;
 using bbiwarg.Images;
 using bbiwarg.Utility;
+using bbiwarg.Graphics;
 using Emgu.CV;
 
 namespace bbiwarg.Recognition.FingerRecognition
@@ -53,5 +54,22 @@ namespace bbiwarg.Recognition.FingerRecognition
 
             return (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3;
         }
+
+        public void draw(OutputImage outputImage, bool tracked)
+        {
+            if (tracked)
+            {
+                outputImage.drawLineSegment(LineSegment, Constants.FingerTrackedColor);
+            }
+            else
+            {
+                for (int i = 0; i < SliceTrail.NumSlices; i++)
+                {
+                    outputImage.drawLineSegment(SliceTrail[i].LineSegment, Constants.FingerSliceColor);
+                }
+                outputImage.drawLineSegment(LineSegment, Constants.FingerDetectedColor);
+                outputImage.drawContour(Contour, Constants.FingerContourColor, 1);
+            }
+        }
     }
 }

+ 1 - 12
bbiwarg/Recognition/FingerRecognition/FingerDetector.cs

@@ -275,19 +275,8 @@ namespace bbiwarg.Recognition.FingerRecognition
         {
             foreach (Finger finger in Fingers)
             {
-                drawFinger(finger);
+                finger.draw(outputImage, false);
             }
         }
-
-        private void drawFinger(Finger finger)
-        {
-            FingerSliceTrail trail = finger.SliceTrail;
-            for (int i = 0; i < trail.NumSlices; i++)
-            {
-                outputImage.drawLineSegment(trail[i].LineSegment, Constants.FingerSliceColor);
-            }
-            outputImage.drawLineSegment(finger.LineSegment, Constants.FingerDetectedColor);
-            outputImage.drawContour(finger.Contour, Constants.FingerContourColor, 1);
-        }
     }
 }

+ 6 - 1
bbiwarg/Recognition/FingerRecognition/FingerHistory.cs

@@ -16,6 +16,8 @@ namespace bbiwarg.Recognition.FingerRecognition
 
     class FingerHistory
     {
+        private static int nextID = 1;
+        public int ID { get; private set; }
         public List<Finger> Fingers { get; private set; }
         public List<TrackingState> States { get; private set; }
         public Finger LastFinger { get; private set; }
@@ -25,6 +27,9 @@ namespace bbiwarg.Recognition.FingerRecognition
 
         public FingerHistory(Finger finger)
         {
+            ID = FingerHistory.nextID;
+            FingerHistory.nextID++;
+
             Fingers = new List<Finger>();
             States = new List<TrackingState>();
 
@@ -61,7 +66,7 @@ namespace bbiwarg.Recognition.FingerRecognition
         {
             TrackingState currentState = CurrentState;
             int count = 0;
-            for (int i = States.Count - 1; i >= 0; i++)
+            for (int i = States.Count - 1; i >= 0; i--)
             {
                 if (States[i] == currentState)
                     count++;

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

@@ -25,20 +25,28 @@ namespace bbiwarg.Recognition.FingerRecognition
         public FingerTracker()
         {
             FingerHistories = new List<FingerHistory>();
+            Fingers = new List<Finger>();
+
         }
 
-        public void updateTrackedFingers(List<Finger> detectedFingers)
+        public void updateTrackedFingers(List<Finger> detectedFingers, OutputImage outputImage)
         {
             if (FingerHistories.Count == 0)
             {
                 foreach (Finger finger in detectedFingers)
-                    FingerHistories.Add(new FingerHistory(finger));
+                {
+                    FingerHistory fh = new FingerHistory(finger);
+                    FingerHistories.Add(fh);
+                    if (Constants.VerboseFingerTracker) Console.WriteLine("Finger #" + fh.ID + " detected");
+                }
             }
             else
             {
                 updateHistories(detectedFingers);
                 removeLongLostFingers();
             }
+
+            drawFingers(outputImage);
         }
 
         private void updateHistories(List<Finger> detectedFingers)
@@ -69,9 +77,11 @@ namespace bbiwarg.Recognition.FingerRecognition
             }
 
             //add new fingerHistory for each new unmatched finger
-            foreach (Finger f in unasignedDetectedFingers)
+            foreach (Finger finger in unasignedDetectedFingers)
             {
-                FingerHistories.Add(new FingerHistory(f));
+                FingerHistory fh = new FingerHistory(finger);
+                FingerHistories.Add(fh);
+                if (Constants.VerboseFingerTracker) Console.WriteLine("Finger #" + fh.ID + " detected");
             }
 
             //add null finger to TrackedFingers that haven't found a match in this frame (status tracked->lost)
@@ -128,9 +138,20 @@ namespace bbiwarg.Recognition.FingerRecognition
         {
             for (int i = FingerHistories.Count - 1; i >= 0; i--)
             {
-                FingerHistory tf = FingerHistories[i];
-                if (tf.CurrentState == TrackingState.Lost && tf.getNumFramesInCurrentState() >= Constants.FingerNumFramesUntilLost)
+                FingerHistory fh = FingerHistories[i];
+                if (fh.CurrentState == TrackingState.Lost && fh.getNumFramesInCurrentState() >= Constants.FingerNumFramesUntilLost)
+                {
                     FingerHistories.RemoveAt(i);
+                    if (Constants.VerboseFingerTracker) Console.WriteLine("Finger #" + fh.ID + " lost");
+                }
+            }
+        }
+
+        private void drawFingers(OutputImage outputImage)
+        {
+            foreach (Finger finger in Fingers)
+            {
+                finger.draw(outputImage, true);
             }
         }
     }

+ 1 - 1
bbiwarg/Server/TUIO/TuioServer.cs

@@ -132,7 +132,7 @@ namespace TUIO
                 }*/
                 packet.Append(currentMessage);
 
-                if(bbiwarg.Constants.sendingSystemTimeEnabled)
+                if(bbiwarg.Constants.VerboseTUIO)
                     Console.WriteLine("Send Cursor "+cursor.getSessionID()+" at time "+TuioTime.getSystemTime().ToString());
             }
             currentMessage = new OSCMessage("/tuio/2Dcur");

+ 1 - 1
bbiwarg/VideoHandle.cs

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

+ 1 - 0
bbiwarg/bbiwarg.csproj

@@ -69,6 +69,7 @@
     <Compile Include="Constants.cs" />
     <Compile Include="Recognition\FingerRecognition\Finger.cs" />
     <Compile Include="Recognition\FingerRecognition\FingerDetector.cs" />
+    <Compile Include="Recognition\FingerRecognition\FingerHistory.cs" />
     <Compile Include="Recognition\FingerRecognition\FingerSliceTrail.cs" />
     <Compile Include="Recognition\FingerRecognition\FingerSlice.cs" />
     <Compile Include="Recognition\FingerRecognition\FingerTracker.cs" />