|
@@ -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;
|
|
|
}
|
|
|
}
|
|
|
}
|