TouchTracker.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. namespace bbiwarg.Recognition.TouchRecognition
  10. {
  11. class TouchTracker
  12. {
  13. private OutputImage outputImage;
  14. private List<TouchEvent>[] detectedTouchEvents;
  15. private int framesUntilTracked;
  16. public List<TouchEvent> TrackedTouchEvents;
  17. public TouchTracker()
  18. {
  19. reset();
  20. }
  21. public void reset() {
  22. framesUntilTracked = Constants.TouchEventNumFramesUntilTracked;
  23. detectedTouchEvents = new List<TouchEvent>[framesUntilTracked];
  24. for (int i = 0; i < framesUntilTracked; i++)
  25. {
  26. detectedTouchEvents[i] = new List<TouchEvent>();
  27. }
  28. }
  29. public void setDetectedTouchEventsThisFrame(List<TouchEvent> touchEventsThisFrame, OutputImage outputImage)
  30. {
  31. this.outputImage = outputImage;
  32. for (int i = (framesUntilTracked - 1); i > 0; i--)
  33. {
  34. detectedTouchEvents[i] = detectedTouchEvents[i - 1];
  35. }
  36. detectedTouchEvents[0] = touchEventsThisFrame;
  37. findTrackedTouches();
  38. }
  39. private void findTrackedTouches()
  40. {
  41. TrackedTouchEvents = new List<TouchEvent>();
  42. foreach (TouchEvent te in detectedTouchEvents[0])
  43. {
  44. bool tracked = true;
  45. for (int i = 1; i < framesUntilTracked; i++)
  46. {
  47. if (!hasSimilarTouchEventInFrame(te, i)) tracked = false;
  48. }
  49. if (tracked)
  50. {
  51. outputImage.fillCircle(te.Position.IntX, te.Position.IntY, 5, Color.Yellow);
  52. TrackedTouchEvents.Add(te);
  53. }
  54. }
  55. }
  56. private bool hasSimilarTouchEventInFrame(TouchEvent touchEvent, int frame)
  57. {
  58. foreach (TouchEvent te in detectedTouchEvents[frame])
  59. {
  60. if (touchEvent.isSimilarTo(te))
  61. return true;
  62. }
  63. return false;
  64. }
  65. }
  66. }