InputHandler.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using bbiwarg.Images;
  2. using bbiwarg.Input.InputProviding;
  3. using bbiwarg.Recognition.FingerRecognition;
  4. using bbiwarg.Recognition.HandRecognition;
  5. using bbiwarg.Recognition.PalmRecognition;
  6. using bbiwarg.Recognition.TouchRecognition;
  7. using bbiwarg.Utility;
  8. using System;
  9. namespace bbiwarg.Input.InputHandling
  10. {
  11. public delegate void NewProcessedFrameEventHandler(object sender, NewProcessedFrameEventArgs e);
  12. public class NewProcessedFrameEventArgs
  13. {
  14. public FrameData FrameData { get; private set; }
  15. public NewProcessedFrameEventArgs(FrameData frameData)
  16. {
  17. FrameData = frameData;
  18. }
  19. }
  20. public class InputHandler
  21. {
  22. private InputProvider inputProvider;
  23. private bool resetFlag;
  24. private FingerDetector fingerDetector;
  25. private HandDetector handDetector;
  26. private PalmDetector palmDetector;
  27. private TouchDetector touchDetector;
  28. private FingerTracker fingerTracker;
  29. private HandTracker handTracker;
  30. private PalmTracker palmTracker;
  31. private TouchTracker touchTracker;
  32. public ImageSize ImageSize;
  33. public FrameData FrameData { get; private set; }
  34. public event NewProcessedFrameEventHandler NewProcessedFrameEvent;
  35. public InputHandler(InputProvider inputProvider)
  36. {
  37. this.inputProvider = inputProvider;
  38. initialize();
  39. inputProvider.NewFrameEvent += handleNewFrame;
  40. VideoInputProvider videoInputProvider = inputProvider as VideoInputProvider;
  41. if (videoInputProvider != null)
  42. videoInputProvider.MovieRestartedEvent += handleMovieRestart;
  43. }
  44. private void initialize()
  45. {
  46. ImageSize = new ImageSize(inputProvider.ImageWidth, inputProvider.ImageHeight);
  47. resetFlag = false;
  48. fingerDetector = new FingerDetector();
  49. handDetector = new HandDetector();
  50. palmDetector = new PalmDetector();
  51. touchDetector = new TouchDetector();
  52. fingerTracker = new FingerTracker(ImageSize);
  53. handTracker = new HandTracker(ImageSize);
  54. palmTracker = new PalmTracker(ImageSize);
  55. touchTracker = new TouchTracker(ImageSize);
  56. }
  57. public void reset()
  58. {
  59. touchTracker.reset();
  60. handTracker.reset();
  61. palmTracker.reset();
  62. fingerTracker.reset();
  63. }
  64. public void handleNewFrame(object sender, NewFrameEventArgs e)
  65. {
  66. Timer.start("InputHandler.handleNewFrame");
  67. FrameData frameData = new FrameData();
  68. frameData.FrameID = e.FrameID;
  69. frameData.ImageSize = ImageSize;
  70. // reset flag
  71. frameData.ResetFlag = resetFlag;
  72. resetFlag = false;
  73. // confidence image
  74. Timer.start("InputHandler.handleNewFrame::createConfidenceImage");
  75. frameData.ConfidenceImage = new ConfidenceImage(e.RawConfidenceData, ImageSize);
  76. Timer.stop("InputHandler.handleNewFrame::createConfidenceImage");
  77. // depth image
  78. Timer.start("InputHandler.handleNewFrame::createDepthImage");
  79. frameData.DepthImage = new DepthImage(e.RawDepthData, ImageSize, frameData.ConfidenceImage);
  80. Timer.stop("InputHandler.handleNewFrame::createDepthImage");
  81. // edge image
  82. Timer.start("InputHandler.handleNewFrame::createEdgeImage");
  83. frameData.EdgeImage = new EdgeImage(frameData.DepthImage);
  84. Timer.stop("InputHandler.handleNewFrame::createEdgeImage");
  85. // detect fingers
  86. Timer.start("InputHandler.handleNewFrame::detectFingers");
  87. fingerDetector.detectFingers(frameData);
  88. Timer.stop("InputHandler.handleNewFrame::detectFingers");
  89. // track fingers
  90. Timer.start("InputHandler.handleNewFrame::trackFingers");
  91. fingerTracker.trackFingers(frameData);
  92. Timer.stop("InputHandler.handleNewFrame::trackFingers");
  93. // detect hands
  94. Timer.start("InputHandler.handleNewFrame::detectHands");
  95. handDetector.detectHands(frameData);
  96. Timer.stop("InputHandler.handleNewFrame::detectHands");
  97. // track hands
  98. Timer.start("InputHandler.handleNewFrame::trackHands");
  99. handTracker.trackHands(frameData);
  100. Timer.stop("InputHandler.handleNewFrame::trackHands");
  101. // detect palms
  102. Timer.start("InputHandler.handleNewFrame::detectPalms");
  103. palmDetector.detectPalms(frameData);
  104. Timer.stop("InputHandler.handleNewFrame::detectPalms");
  105. // track palms
  106. Timer.start("InputHandler.handleNewFrame::trackPalms");
  107. palmTracker.trackPalms(frameData);
  108. Timer.stop("InputHandler.handleNewFrame::trackPalms");
  109. // detect touches
  110. Timer.start("InputHandler.handleNewFrame::detectTouches");
  111. touchDetector.detectTouches(frameData);
  112. Timer.stop("InputHandler.handleNewFrame::detectTouches");
  113. //track touches
  114. Timer.start("InputHandler.handleNewFrame::trackTouches");
  115. touchTracker.trackTouches(frameData);
  116. Timer.stop("InputHandler.handleNewFrame::trackTouches");
  117. Timer.start("InputHandler.handleNewFrame::exportResults");
  118. FrameData = frameData;
  119. if (NewProcessedFrameEvent != null)
  120. NewProcessedFrameEvent(this, new NewProcessedFrameEventArgs(frameData));
  121. Timer.stop("InputHandler.handleNewFrame::exportResults");
  122. Timer.stop("InputHandler.handleNewFrame");
  123. if (Parameters.LoggerTimerOutputEnabled)
  124. Timer.outputAll();
  125. }
  126. private void handleMovieRestart(object sender, EventArgs e)
  127. {
  128. reset();
  129. resetFlag = true;
  130. }
  131. }
  132. }