瀏覽代碼

improved fingerTracker

Alexander Hendrich 11 年之前
父節點
當前提交
ab1d3dec68
共有 2 個文件被更改,包括 36 次插入19 次删除
  1. 16 10
      bbiwarg/Detectors/Fingers/Finger.cs
  2. 20 9
      bbiwarg/Detectors/Fingers/FingerTracker.cs

+ 16 - 10
bbiwarg/Detectors/Fingers/Finger.cs

@@ -78,20 +78,26 @@ namespace bbiwarg.Detectors.Fingers
             return minDinstance;
         }
 
-        public bool isSimilarTo(Finger compareFinger) {
-            PointF center = new PointF((lineEndPoint1.X + lineEndPoint2.X) / 2, (lineEndPoint1.Y + lineEndPoint2.Y) / 2);
-            PointF compareCenter = new PointF((compareFinger.getLineEndPoint1().X+compareFinger.getLineEndPoint2().X)/2, (compareFinger.getLineEndPoint1().Y+compareFinger.getLineEndPoint2().Y)/2);
+        public float getSimilarity(Finger compareFinger) {
+            //startDistance
+            float maxStartDistance = 100;
+            float xDiffStart = lineEndPoint1.X - compareFinger.getLineEndPoint1().X;
+            float yDiffStart = lineEndPoint1.X - compareFinger.getLineEndPoint1().Y;
+            float startDistance = (float)Math.Sqrt(xDiffStart * xDiffStart + yDiffStart * yDiffStart);
+            float startSimilarity = Math.Max(1 - (startDistance / maxStartDistance), 0);
 
-            float xDiff = center.X - compareCenter.X;
-            float yDiff = center.Y - compareCenter.Y;
-            float centerDistance = (float)Math.Sqrt(xDiff * xDiff + yDiff * yDiff);
-            float maxCenterDistance = 40;
+            //endDistance
+            float maxEndDistance = 50;
+            float xDiffEnd = lineEndPoint2.X - compareFinger.getLineEndPoint2().X;
+            float yDiffEnd = lineEndPoint2.X - compareFinger.getLineEndPoint2().Y;
+            float endDistance = (float)Math.Sqrt(xDiffEnd * xDiffEnd + yDiffEnd * yDiffEnd);
+            float endSimilarity = Math.Max(1 - (endDistance / maxEndDistance), 0);
 
-            if (centerDistance > maxCenterDistance)
-                return false;
+            //direction
 
 
-            return true;
+
+            return (0.2f*startSimilarity + 0.8f*endSimilarity);
             
         }
 

+ 20 - 9
bbiwarg/Detectors/Fingers/FingerTracker.cs

@@ -15,7 +15,7 @@ namespace bbiwarg.Detectors.Fingers
         private int framesUntilTracked;
 
         public FingerTracker() {
-            framesUntilTracked = 5;
+            framesUntilTracked = 3;
             detectedFingers = new List<Finger>[framesUntilTracked];
 
             for (int i = 0; i < framesUntilTracked; i++)
@@ -44,14 +44,22 @@ namespace bbiwarg.Detectors.Fingers
 
         private void findTrackedFingers()
         {
+            float minSimilarity = 0.6f;
             trackedFingers = new List<Finger>();
 
             foreach (Finger finger in detectedFingers[0])
             {
                 bool tracked = true;
+                Finger mostSimilarLastFrame = finger;
                 for (int i = 1; i < framesUntilTracked; i++)
                 {
-                    if (!hasSimilarFingerInFrame(finger, i)) tracked = false;
+                    Finger mostSimilarThisFrame = getMostSimilarFingerInFrame(mostSimilarLastFrame, i);
+                    if (mostSimilarThisFrame != null && mostSimilarLastFrame.getSimilarity(mostSimilarThisFrame) < minSimilarity)
+                    {
+                        tracked = false;
+                        break;
+                       
+                    }
                 }
                 if (tracked)
                 {
@@ -61,14 +69,17 @@ namespace bbiwarg.Detectors.Fingers
             }
         }
 
-        private bool hasSimilarFingerInFrame(Finger finger, int frame) {
-            foreach (Finger f in detectedFingers[frame])
-            {
-                if (finger.isSimilarTo(f))
-                    return true;
+        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 false;
+            return mostSimilarFinger;
         }
     }
 }