InputHandler.cs 6.0 KB

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