TouchTracker.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using bbiwarg.Images;
  8. using bbiwarg.Graphics;
  9. using bbiwarg.Recognition.Tracking;
  10. using bbiwarg.Utility;
  11. namespace bbiwarg.Recognition.TouchRecognition
  12. {
  13. class TouchTracker : Tracker<TouchEvent, TrackedTouchEvent>
  14. {
  15. public List<TouchEvent> TouchEvents { get { return getCurrentObjectsWithState(TrackingState.Tracked); } }
  16. public event TouchEventHandler TouchDown;
  17. public event TouchEventHandler TouchMove;
  18. public event TouchEventHandler TouchUp;
  19. public TouchTracker()
  20. : base(Parameters.TouchTrackerMinSimilarity)
  21. {
  22. }
  23. protected override TrackedTouchEvent createTrackedObject(TouchEvent detectedObject)
  24. {
  25. TrackedTouchEvent tte = new TrackedTouchEvent(idPool.getNextUnusedID(), detectedObject, Parameters.TouchTrackerNumFramesDetectedUntilTracked, Parameters.TouchTrackerNumFramesLostUntilDeleted);
  26. tte.TouchDown += TouchDown;
  27. tte.TouchMove += TouchMove;
  28. tte.TouchUp += TouchUp;
  29. return tte;
  30. }
  31. }
  32. /*
  33. public class PalmTouchEventArgs : EventArgs
  34. {
  35. public int TrackID { get; private set; }
  36. public Vector2D Position { get; private set; }
  37. public PalmTouchEventArgs(int trackID, Vector2D position)
  38. {
  39. TrackID = trackID;
  40. Position = position;
  41. }
  42. }
  43. public delegate void PalmTouchEventHandler(object sender, PalmTouchEventArgs e);
  44. class TouchTracker : OldTracker<TouchEvent>
  45. {
  46. public List<TouchEvent> TouchEvents { get { return TrackedObjects; } }
  47. public Dictionary<int, Kalman2DPositionFilter> kalmanFilters;
  48. public event PalmTouchEventHandler PalmTouchDown;
  49. public event PalmTouchEventHandler PalmTouchMove;
  50. public event PalmTouchEventHandler PalmTouchUp;
  51. protected virtual void OnPalmTouchDown(PalmTouchEventArgs e) { if (PalmTouchDown != null) PalmTouchDown(this, e); }
  52. protected virtual void OnPalmTouchMove(PalmTouchEventArgs e) { if (PalmTouchMove != null) PalmTouchMove(this, e); }
  53. protected virtual void OnPalmTouchUp(PalmTouchEventArgs e) { if (PalmTouchUp != null) PalmTouchUp(this, e); }
  54. public TouchTracker()
  55. : base(Constants.TouchEventNumFramesDetectedUntilTracked, Constants.TouchEventNumFramesLostUntilDeleted, Constants.TouchEventMinSimilarityForTracking)
  56. {
  57. kalmanFilters = new Dictionary<int, Kalman2DPositionFilter>();
  58. }
  59. public new void reset()
  60. {
  61. foreach (int id in kalmanFilters.Keys)
  62. {
  63. OnPalmTouchUp(new PalmTouchEventArgs(id, kalmanFilters[id].getPrediction()));
  64. }
  65. kalmanFilters.Clear();
  66. base.reset();
  67. }
  68. protected override void onDetect(object sender, EventArgs e)
  69. {
  70. OldTrackableObjectHistory<TouchEvent> history = (OldTrackableObjectHistory<TouchEvent>)sender;
  71. if (history.NumFramesInCurrentState == 1)
  72. Logger.log("TouchEvent #" + history.ID.ToString() + " detected", LogSubject.TouchTracker);
  73. }
  74. protected override void onTrack(object sender, EventArgs e)
  75. {
  76. OldTrackableObjectHistory<TouchEvent> history = (OldTrackableObjectHistory<TouchEvent>)sender;
  77. if (history.NumFramesInCurrentState == 1)
  78. Logger.log("TouchEvent #" + history.ID.ToString() + " tracked", LogSubject.TouchTracker);
  79. if (history.LastObject is PalmTouchEvent)
  80. {
  81. PalmTouchEvent pte = (PalmTouchEvent)history.LastObject;
  82. if (history.NumFramesInCurrentState == 1)
  83. palmTouchDown(history.ID, pte.RelativePalmPosition);
  84. else
  85. palmTouchMove(history.ID, pte.RelativePalmPosition);
  86. }
  87. }
  88. protected override void onRetrack(object sender, EventArgs e)
  89. {
  90. OldTrackableObjectHistory<TouchEvent> history = (OldTrackableObjectHistory<TouchEvent>)sender;
  91. if (history.NumFramesInCurrentState == 1)
  92. Logger.log("TouchEvent #" + history.ID.ToString() + " retracked", LogSubject.TouchTracker);
  93. if (history.LastObject is PalmTouchEvent)
  94. {
  95. PalmTouchEvent pte = (PalmTouchEvent)history.LastObject;
  96. palmTouchMove(history.ID, pte.RelativePalmPosition);
  97. }
  98. else throw new ArgumentException();
  99. }
  100. protected override void onLoose(object sender, EventArgs e)
  101. {
  102. OldTrackableObjectHistory<TouchEvent> history = (OldTrackableObjectHistory<TouchEvent>)sender;
  103. if (history.NumFramesInCurrentState == 1)
  104. Logger.log("TouchEvent #" + history.ID.ToString() + " lost", LogSubject.TouchTracker);
  105. }
  106. protected override void onDelete(object sender, EventArgs e)
  107. {
  108. OldTrackableObjectHistory<TouchEvent> history = (OldTrackableObjectHistory<TouchEvent>)sender;
  109. if (history.NumFramesInCurrentState == 1)
  110. Logger.log("TouchEvent #" + history.ID.ToString() + " deleted", LogSubject.TouchTracker);
  111. if (history.LastObject is PalmTouchEvent)
  112. {
  113. PalmTouchEvent pte = (PalmTouchEvent)history.LastObject;
  114. palmTouchUp(history.ID, pte.RelativePalmPosition);
  115. }
  116. else throw new ArgumentException();
  117. }
  118. private void palmTouchDown(int id, Vector2D relPos)
  119. {
  120. Kalman2DPositionFilter kalmanFilter = new Kalman2DPositionFilter(Constants.TouchmXX, Constants.TouchmXY, Constants.TouchmYY, Constants.TouchProcessNoise);
  121. kalmanFilter.setInitialPosition(relPos);
  122. kalmanFilters.Add(id, kalmanFilter);
  123. OnPalmTouchDown(new PalmTouchEventArgs(id, relPos));
  124. Logger.log("TouchEvent #" + id.ToString() + " touchDown at (" + relPos.X + ", " + relPos.Y + ")", LogSubject.TouchEvents);
  125. }
  126. private void palmTouchMove(int id, Vector2D relPos)
  127. {
  128. Vector2D correctedRelPos = kalmanFilters[id].getCorrectedPosition(relPos);
  129. OnPalmTouchMove(new PalmTouchEventArgs(id, correctedRelPos));
  130. Logger.log("TouchEvent #" + id.ToString() + " touchMove to (" + relPos.X + ", " + relPos.Y + ")", LogSubject.TouchEvents);
  131. }
  132. private void palmTouchUp(int id, Vector2D relPos)
  133. {
  134. Kalman2DPositionFilter kalmanFilter;
  135. if (kalmanFilters.TryGetValue(id, out kalmanFilter))
  136. {
  137. Vector2D correctedRelPos = kalmanFilter.getCorrectedPosition(relPos);
  138. OnPalmTouchUp(new PalmTouchEventArgs(id, correctedRelPos));
  139. kalmanFilters.Remove(id);
  140. Logger.log("TouchEvent #" + id.ToString() + " touchUp at (" + relPos.X + ", " + relPos.Y + ")", LogSubject.TouchEvents);
  141. }
  142. }
  143. }*/
  144. }