TrackedTouch.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using bbiwarg.Recognition.Tracking;
  7. using bbiwarg.Utility;
  8. namespace bbiwarg.Recognition.TouchRecognition
  9. {
  10. public enum TouchEventType
  11. {
  12. Down,
  13. Move,
  14. Up
  15. }
  16. public delegate void TouchEventHandler(TrackedTouch sender, TouchEventArgs e);
  17. public class TouchEventArgs
  18. {
  19. public int TrackID { get; private set; }
  20. public TouchEventType Type { get; private set; }
  21. public Touch Touch { get; private set; }
  22. public TouchEventArgs(int trackID, TouchEventType type, Touch touch)
  23. {
  24. TrackID = trackID;
  25. Type = type;
  26. Touch = touch;
  27. }
  28. }
  29. public class TrackedTouch : TrackedObject<Touch>
  30. {
  31. private Kalman2DPositionFilter absolutePositionKalman;
  32. private int fingerID;
  33. public Vector2D AbsolutePositionPrediction { get { return absolutePositionKalman.getPrediction(); } }
  34. public Touch OptimizedTouch { get; private set; }
  35. public bool IsTouchActive { get; private set; }
  36. public event TouchEventHandler TouchEvent;
  37. public TrackedTouch(int id, Touch detectedTouch, int numFramesDetectedUntilTracked, int numFramesLostUntilDeleted)
  38. : base(id, detectedTouch, numFramesDetectedUntilTracked, numFramesLostUntilDeleted)
  39. {
  40. absolutePositionKalman = new Kalman2DPositionFilter(Parameters.TouchmXX, Parameters.TouchmXY, Parameters.TouchmYY);
  41. absolutePositionKalman.setInitialPosition(detectedTouch.AbsolutePosition);
  42. fingerID = detectedTouch.Finger.TrackID;
  43. IsTouchActive = false;
  44. logStateChange();
  45. }
  46. public override void updateFrame(Touch detectedTouch)
  47. {
  48. base.updateFrame(detectedTouch);
  49. if (NumFramesInCurrentState == 1)
  50. logStateChange();
  51. if (detectedTouch != null)
  52. {
  53. absolutePositionKalman.getCorrectedPosition(detectedTouch.AbsolutePosition);
  54. updateOptimizedTouch(detectedTouch);
  55. if (CurrentState == TrackingState.Tracked)
  56. {
  57. if (!IsTouchActive)
  58. TriggerTouchDown();
  59. else
  60. TriggerTouchMove();
  61. }
  62. }
  63. else if (IsTouchActive && CurrentState == TrackingState.Deleted)
  64. TriggerTouchUp();
  65. }
  66. private void updateOptimizedTouch(Touch detectedTouch)
  67. {
  68. OptimizedTouch = new Touch(AbsolutePositionPrediction, detectedTouch.Finger, detectedTouch.Palm);
  69. }
  70. public override float calculateSimilarity(Touch detectedTouchEvent)
  71. {
  72. float fingerSimilarity = (fingerID == detectedTouchEvent.Finger.TrackID) ? 1 : 0;
  73. //float absolutePositionSimilarity = getPositionSimilarity(AbsolutePositionPrediction, detectedTouchEvent.AbsolutePosition, Parameters.TouchTrackerMaxAbsolutePositionMove);
  74. //float relativePositionSimilarity = getPositionSimilarity(RelativePositionPrediction, detectedTouchEvent.RelativePosition, Parameters.TouchTrackerMaxRelativePositionMove);
  75. float similarity = fingerSimilarity;// *absolutePositionSimilarity * relativePositionSimilarity;
  76. return similarity;
  77. }
  78. private void logStateChange()
  79. {
  80. String stateAsString = CurrentState.ToString().ToLower();
  81. Logger.log(String.Format("TouchEvent #{0} {1}", this.ID, stateAsString), LogSubject.TouchTracker);
  82. }
  83. private void TriggerTouchDown()
  84. {
  85. if (TouchEvent != null)
  86. {
  87. IsTouchActive = true;
  88. TouchEvent(this, new TouchEventArgs(ID, TouchEventType.Down, OptimizedTouch));
  89. }
  90. }
  91. private void TriggerTouchMove()
  92. {
  93. if (TouchEvent != null)
  94. {
  95. TouchEvent(this, new TouchEventArgs(ID, TouchEventType.Move, OptimizedTouch));
  96. }
  97. }
  98. private void TriggerTouchUp()
  99. {
  100. if (TouchEvent != null)
  101. {
  102. IsTouchActive = false;
  103. TouchEvent(this, new TouchEventArgs(ID, TouchEventType.Up, OptimizedTouch));
  104. }
  105. }
  106. }
  107. }