Sfoglia il codice sorgente

minor changes to fingerTracker

Alexander Hendrich 11 anni fa
parent
commit
2377fc460f

+ 3 - 1
bbiwarg/Constants.cs

@@ -13,7 +13,7 @@ namespace bbiwarg
     {
         // Logger
         public static readonly LogSubject LogLevel =
-            LogSubject.FingerTracker;
+            LogSubject.None;
         
         // Output
         public static readonly int OutputNumImages = 5;
@@ -55,6 +55,8 @@ namespace bbiwarg
         public static readonly int FingerNumFramesUntilTracked = 5;
         public static readonly int FingerNumFramesUntilLost = 10;
         public static readonly float FingerMinSimilarityForTracking = 0.1f;
+        public static readonly float FingerSimilarityMaxTipPointDistance = 100;
+        public static readonly float FingerSimilarityMaxHandPointDistance = 50;
         public static readonly float FingerSimilarityMaxAngle = (float)(30 * Math.PI / 180); // 30°
         public static readonly float FingerSimilarityMaxParallelDistance = 80;
         public static readonly float FingerSimilarityMaxVerticalDistance = 20;

+ 14 - 3
bbiwarg/Recognition/FingerRecognition/Finger.cs

@@ -25,7 +25,8 @@ namespace bbiwarg.Recognition.FingerRecognition
         public FingerSliceTrail SliceTrail { get; private set; }
         public Contour<Point> Contour { get { return SliceTrail.getContour(); } }
 
-        public Finger(FingerSliceTrail sliceTrail) : base()
+        public Finger(FingerSliceTrail sliceTrail)
+            : base()
         {
             SliceTrail = sliceTrail;
         }
@@ -33,10 +34,17 @@ namespace bbiwarg.Recognition.FingerRecognition
         public override float getSimilarity(TrackableObject compareObject)
         {
             Finger compareFinger = (Finger)compareObject;
-
             LineSegment2D compareLineSegment = compareFinger.LineSegment;
             Line2D compareLine = compareLineSegment.Line;
+            /*
+            //tip position
+            float tipPointDistance = TipPoint.getDistanceTo(compareFinger.TipPoint);
+            float tipPointSimilarity = Math.Max(0, 1 - tipPointDistance / Constants.FingerSimilarityMaxTipPointDistance);
 
+            //hand position
+            float handPointDistance = HandPoint.getDistanceTo(compareFinger.HandPoint);
+            float handPointSimilarity = Math.Max(0, 1 - handPointDistance / Constants.FingerSimilarityMaxHandPointDistance);
+            */
             //check angle
             float angle = LineSegment.Line.getAngleBetween(compareLine);
             float angleSimilarity = Math.Max(1 - angle / Constants.FingerSimilarityMaxAngle, 0);
@@ -49,7 +57,10 @@ namespace bbiwarg.Recognition.FingerRecognition
             float verticalDistance = LineSegment.getVerticalDistanceTo(compareLineSegment);
             float verticalDistanceSimilarity = Math.Max(1 - verticalDistance / Constants.FingerSimilarityMaxVerticalDistance, 0);
 
-            return (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3;
+            //float similarity = tipPointSimilarity * handPointSimilarity * angleSimilarity * parallelDistanceSimilarity * verticalDistanceSimilarity;
+            float similarity = (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3;
+
+            return similarity;
         }
 
         public void draw(OutputImage outputImage, bool tracked)

+ 21 - 0
bbiwarg/Recognition/Tracking/SimilarityContainer.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace bbiwarg.Recognition.Tracking
+{
+    class SimilarityContainer<T> where T : TrackableObject
+    {
+        public float Similarity { get; private set; }
+        public TrackableObjectHistory<T> History { get; private set; }
+        public T DetectedObject { get; private set; }
+
+        public SimilarityContainer(TrackableObjectHistory<T> history, T detectedObject) {
+            Similarity = detectedObject.getSimilarity(history.LastObject);
+            History = history;
+            DetectedObject = detectedObject;
+        }
+    }
+}

+ 4 - 4
bbiwarg/Recognition/Tracking/TrackableObject.cs

@@ -9,18 +9,18 @@ namespace bbiwarg.Recognition.Tracking
     abstract class TrackableObject
     {
         public bool IsTracked { get; private set; }
-        public TrackableObjectHistory<TrackableObject> History { get; private set; }
-        public int TrackID { get { return (IsTracked) ? History.ID : 0; } }
+        public int TrackID { get; private set; }
 
         public TrackableObject() {
             IsTracked = false;
+            TrackID = 0;
         }
 
         abstract public float getSimilarity(TrackableObject compareObject);
 
-        public void setTracked(TrackableObjectHistory<TrackableObject> history) {
+        public void setTracked(int id) {
             IsTracked = true;
-            History = history;
+            TrackID = id;
         }
     }
 }

+ 3 - 1
bbiwarg/Recognition/Tracking/TrackableObjectHistory.cs

@@ -38,7 +38,6 @@ namespace bbiwarg.Recognition.Tracking
 
             if (detectedObject != null)
             {
-                LastObject = detectedObject;
                 if (previousState == TrackingState.Tracked)
                     newState = TrackingState.Tracked;
                 else if (previousState == TrackingState.Detected)
@@ -48,6 +47,9 @@ namespace bbiwarg.Recognition.Tracking
                     else
                         newState = TrackingState.Detected;
                 }
+
+                LastObject = detectedObject;
+                detectedObject.setTracked(ID);
             }
             else 
                 newState = TrackingState.Lost;

+ 5 - 15
bbiwarg/Recognition/Tracking/Tracker.cs

@@ -16,13 +16,6 @@ namespace bbiwarg.Recognition.Tracking
         Lost,
     }
 
-    struct SimilarityContainer<T> where T : TrackableObject
-    {
-        public float similarity;
-        public TrackableObjectHistory<T> history;
-        public T detectedObject;
-    }
-
     class Tracker<T> where T : TrackableObject
     {
         public List<TrackableObjectHistory<T>> Histories { get; private set; }
@@ -87,8 +80,8 @@ namespace bbiwarg.Recognition.Tracking
             while (similarities.Count > 0)
             {
                 SimilarityContainer<T> maxSimilarity = similarities[0];
-                TrackableObjectHistory<T> history = maxSimilarity.history;
-                T detectedObject = maxSimilarity.detectedObject;
+                TrackableObjectHistory<T> history = maxSimilarity.History;
+                T detectedObject = maxSimilarity.DetectedObject;
                 history.addObjectToHistory(detectedObject);
 
                 TrackedObjects.Add(detectedObject);
@@ -125,17 +118,14 @@ namespace bbiwarg.Recognition.Tracking
                     float similarity = detectedObject.getSimilarity(history.LastObject);
                     if (similarity > minSimilarityForTracking)
                     {
-                        SimilarityContainer<T> similarityContainer = new SimilarityContainer<T>();
-                        similarityContainer.similarity = similarity;
-                        similarityContainer.history = history;
-                        similarityContainer.detectedObject = detectedObject;
+                        SimilarityContainer<T> similarityContainer = new SimilarityContainer<T>(history, detectedObject);
                         similarities.Add(similarityContainer);
                     }
                 }
             }
 
             // sort depending on similarity-value
-            similarities.Sort((fs1, fs2) => fs2.similarity.CompareTo(fs1.similarity));
+            similarities.Sort((fs1, fs2) => fs2.Similarity.CompareTo(fs1.Similarity));
         }
 
         private void removeConcurringSimilarities(SimilarityContainer<T> removeSimilarity)
@@ -143,7 +133,7 @@ namespace bbiwarg.Recognition.Tracking
             for (int i = similarities.Count - 1; i >= 0; i--)
             {
                 SimilarityContainer<T> similarity = similarities[i];
-                if (similarity.history == removeSimilarity.history || similarity.detectedObject == removeSimilarity.detectedObject)
+                if (similarity.History == removeSimilarity.History || similarity.DetectedObject == removeSimilarity.DetectedObject)
                     similarities.RemoveAt(i);
             }
         }

+ 1 - 0
bbiwarg/Utility/Logger.cs

@@ -8,6 +8,7 @@ namespace bbiwarg.Utility
 {
     public enum LogSubject
     {
+        None = 0,
         FingerDetector = 1,
         FingerTracker = 2,
         HandDetector = 4,

+ 3 - 0
bbiwarg/VideoHandle.cs

@@ -180,6 +180,9 @@ namespace bbiwarg
             //track fingers
             Timer.start("fingerTracking");
             fingerTracker.updateFrame(fingerDetector.Fingers);
+            foreach (Finger f in fingerTracker.TrackedObjects) {
+                OutputImages[1].drawText(f.MidPoint.IntX, f.MidPoint.IntY, f.TrackID.ToString(), Constants.FingerIDColor);
+            }
             Timer.stop("fingerTracking");
 
             //detect hands

+ 1 - 0
bbiwarg/bbiwarg.csproj

@@ -90,6 +90,7 @@
     <Compile Include="InputProvider\IisuInputProvider.cs" />
     <Compile Include="MainBBWIWARG.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Recognition\Tracking\SimilarityContainer.cs" />
     <Compile Include="Recognition\Tracking\TrackableObject.cs" />
     <Compile Include="Recognition\Tracking\TrackableObjectHistory.cs" />
     <Compile Include="Recognition\Tracking\Tracker.cs" />