FingerTracker.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. framesUntilTracked = 3;
  17. detectedFingers = new List<Finger>[framesUntilTracked];
  18. TrackedFingers = new List<Finger>();
  19. for (int i = 0; i < framesUntilTracked; i++)
  20. {
  21. detectedFingers[i] = new List<Finger>();
  22. }
  23. }
  24. public void setDetectedTouchEventsThisFrame(List<Finger> detectedFingersThisFrame, FingerImage fingerImage)
  25. {
  26. this.fingerImage = fingerImage;
  27. for (int i = (framesUntilTracked - 1); i > 0; i--)
  28. {
  29. detectedFingers[i] = detectedFingers[i - 1];
  30. }
  31. detectedFingers[0] = detectedFingersThisFrame;
  32. findTrackedFingers();
  33. }
  34. private void findTrackedFingers()
  35. {
  36. float minSimilarity = 0.75f;
  37. TrackedFingers = new List<Finger>();
  38. foreach (Finger finger in detectedFingers[0])
  39. {
  40. bool tracked = true;
  41. Finger mostSimilarLastFrame = finger;
  42. for (int i = 1; i < framesUntilTracked; i++)
  43. {
  44. Finger mostSimilarThisFrame = getMostSimilarFingerInFrame(mostSimilarLastFrame, i);
  45. if (mostSimilarThisFrame == null || mostSimilarLastFrame.getSimilarity(mostSimilarThisFrame) < minSimilarity)
  46. {
  47. tracked = false;
  48. break;
  49. }
  50. }
  51. if (tracked)
  52. {
  53. fingerImage.drawLine(finger.LineSegment, FingerImageState.fingerTracked);
  54. TrackedFingers.Add(finger);
  55. }
  56. }
  57. }
  58. private Finger getMostSimilarFingerInFrame(Finger finger, int frame) {
  59. Finger mostSimilarFinger = null;
  60. float maxSimilarity = 0;
  61. foreach (Finger f in detectedFingers[frame]) {
  62. float similarity = finger.getSimilarity(f);
  63. if (similarity > maxSimilarity) {
  64. mostSimilarFinger = f;
  65. maxSimilarity = similarity;
  66. }
  67. }
  68. return mostSimilarFinger;
  69. }
  70. }
  71. }