FingerTracker.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using bbiwarg.Images;
  7. namespace bbiwarg.Detectors.Fingers
  8. {
  9. class FingerTracker
  10. {
  11. private FingerImage fingerImage;
  12. private List<Finger>[] detectedFingers;
  13. private int framesUntilTracked;
  14. public List<Finger> TrackedFingers { get; private set; }
  15. public FingerTracker()
  16. {
  17. framesUntilTracked = 3;
  18. detectedFingers = new List<Finger>[framesUntilTracked];
  19. TrackedFingers = new List<Finger>();
  20. for (int i = 0; i < framesUntilTracked; i++)
  21. {
  22. detectedFingers[i] = new List<Finger>();
  23. }
  24. }
  25. public void setDetectedTouchEventsThisFrame(List<Finger> detectedFingersThisFrame, FingerImage fingerImage)
  26. {
  27. this.fingerImage = fingerImage;
  28. for (int i = (framesUntilTracked - 1); i > 0; i--)
  29. {
  30. detectedFingers[i] = detectedFingers[i - 1];
  31. }
  32. detectedFingers[0] = detectedFingersThisFrame;
  33. findTrackedFingers();
  34. }
  35. private void findTrackedFingers()
  36. {
  37. float minSimilarity = 0.75f;
  38. TrackedFingers = new List<Finger>();
  39. foreach (Finger finger in detectedFingers[0])
  40. {
  41. bool tracked = true;
  42. Finger mostSimilarLastFrame = finger;
  43. for (int i = 1; i < framesUntilTracked; i++)
  44. {
  45. Finger mostSimilarThisFrame = getMostSimilarFingerInFrame(mostSimilarLastFrame, i);
  46. if (mostSimilarThisFrame == null || mostSimilarLastFrame.getSimilarity(mostSimilarThisFrame) < minSimilarity)
  47. {
  48. tracked = false;
  49. break;
  50. }
  51. }
  52. if (tracked)
  53. {
  54. fingerImage.drawLine(finger.LineSegment, FingerImageState.fingerTracked);
  55. TrackedFingers.Add(finger);
  56. }
  57. }
  58. }
  59. private Finger getMostSimilarFingerInFrame(Finger finger, int frame)
  60. {
  61. Finger mostSimilarFinger = null;
  62. float maxSimilarity = 0;
  63. foreach (Finger f in detectedFingers[frame])
  64. {
  65. float similarity = finger.getSimilarity(f);
  66. if (similarity > maxSimilarity)
  67. {
  68. mostSimilarFinger = f;
  69. maxSimilarity = similarity;
  70. }
  71. }
  72. return mostSimilarFinger;
  73. }
  74. }
  75. }