VideoHandle.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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 System.Diagnostics;
  8. using bbiwarg.Utility;
  9. using bbiwarg.Detectors.Fingers;
  10. using bbiwarg.Detectors.Palm;
  11. using bbiwarg.Detectors.Touch;
  12. using bbiwarg.Images;
  13. using bbiwarg.InputProviders;
  14. using Emgu.CV;
  15. using Emgu.CV.Structure;
  16. using bbiwarg.Graphics;
  17. namespace bbiwarg
  18. {
  19. class VideoHandle
  20. {
  21. private IInputProvider inputProvider;
  22. private InputFrame inputFrame;
  23. public int Width { get; private set; }
  24. public int Height { get; private set; }
  25. public OutputImage[] OutputImages { get; private set; }
  26. private DepthImage depthImage;
  27. private EdgeImage edgeImage;
  28. private FingerDetector fingerDetector;
  29. private PalmDetector palmDetector;
  30. private TouchDetector touchDetector;
  31. private PalmTouchDetector palmTouchDetector;
  32. private FingerTracker fingerTracker;
  33. private TouchTracker touchTracker;
  34. private OutputImage edgeFingerOutputImage;
  35. private OutputImage depthPalmTouchOutputImage;
  36. private TouchEventVisualizer touchEventVisualizer;
  37. private int videoFrame = 0;
  38. public VideoHandle(IInputProvider inputProvider)
  39. {
  40. this.inputProvider = inputProvider;
  41. //initialize trackers
  42. touchTracker = new TouchTracker();
  43. fingerTracker = new FingerTracker();
  44. }
  45. public void start()
  46. {
  47. inputProvider.init();
  48. inputProvider.start();
  49. inputProvider.updateFrame();
  50. processFrameUpdate();
  51. }
  52. public void stop()
  53. {
  54. inputProvider.stop();
  55. }
  56. public int getCurrentMovieFrame()
  57. {
  58. return inputProvider.getCurrentMovieFrame();
  59. }
  60. public bool sourceIsMovie()
  61. {
  62. return inputProvider.sourceIsMovie();
  63. }
  64. public void reversePlay()
  65. {
  66. inputProvider.reversePlay();
  67. }
  68. public void pauseMovie()
  69. {
  70. inputProvider.pauseMovie();
  71. }
  72. public void unpauseMovie()
  73. {
  74. inputProvider.unpauseMovie();
  75. }
  76. public void nextFrame()
  77. {
  78. if (inputProvider.isActive())
  79. {
  80. inputProvider.releaseFrame();
  81. inputProvider.updateFrame();
  82. processFrameUpdate();
  83. }
  84. else
  85. {
  86. inputProvider.stop();
  87. }
  88. ++videoFrame;
  89. }
  90. public List<PalmTouchEvent> getPalmTouchEvents()
  91. {
  92. return palmTouchDetector.PalmTouchEvents;
  93. }
  94. private void processFrameUpdate()
  95. {
  96. Timer.start("processFrameUpdate");
  97. //read data from inputProvider
  98. Timer.start("readInputData");
  99. inputFrame = inputProvider.getInputFrame();
  100. Width = inputFrame.Width;
  101. Height = inputFrame.Height;
  102. Timer.stop("readInputData");
  103. //create output images
  104. Timer.start("createOtherImages");
  105. edgeFingerOutputImage = new OutputImage(Width, Height);
  106. depthPalmTouchOutputImage = new OutputImage(Width, Height);
  107. Timer.stop("createOtherImages");
  108. //create depthImage
  109. Timer.start("createDepthImage");
  110. Image<Gray, Int16> image = new Image<Gray, Int16>(Width, Height, Width * 2, inputFrame.RawDepthData);
  111. depthImage = new DepthImage(image, depthPalmTouchOutputImage);
  112. Timer.stop("createDepthImage");
  113. // create edge image
  114. Timer.start("createEdgeImage");
  115. edgeImage = new EdgeImage(depthImage, edgeFingerOutputImage);
  116. Timer.stop("createEdgeImage");
  117. //detect fingers
  118. Timer.start("fingerDetection");
  119. fingerDetector = new FingerDetector(depthImage, edgeImage, edgeFingerOutputImage);
  120. Timer.stop("fingerDetection");
  121. //track fingers
  122. Timer.start("fingerTracking");
  123. fingerTracker.setDetectedTouchEventsThisFrame(fingerDetector.Fingers, edgeFingerOutputImage);
  124. Timer.stop("fingerTracking");
  125. //detect palm
  126. Timer.start("palmDetection");
  127. palmDetector = new PalmDetector(depthImage, edgeImage, fingerTracker.TrackedFingers, depthPalmTouchOutputImage);
  128. if (sourceIsMovie() && getCurrentMovieFrame() == 0)
  129. PalmDetector.resetFilter();
  130. Timer.stop("palmDetection");
  131. //detect touchEvents
  132. Timer.start("touchDetection");
  133. touchDetector = new TouchDetector(fingerTracker.TrackedFingers, depthImage, depthPalmTouchOutputImage);
  134. if (palmDetector.PalmQuad != null)
  135. palmTouchDetector = new PalmTouchDetector(touchDetector.TouchEvents, palmDetector.PalmQuad);
  136. Timer.stop("touchDetection");
  137. //track touchEvents
  138. Timer.start("touchTracking");
  139. touchTracker.setDetectedTouchEventsThisFrame(touchDetector.TouchEvents, depthPalmTouchOutputImage);
  140. Timer.stop("touchTracking");
  141. // touch event visualizer
  142. if (touchEventVisualizer == null)
  143. touchEventVisualizer = new TouchEventVisualizer(Width, Height);
  144. if (getCurrentMovieFrame() == 0)
  145. touchEventVisualizer.Reset();
  146. if (palmTouchDetector != null)
  147. {
  148. foreach (PalmTouchEvent e in palmTouchDetector.PalmTouchEvents)
  149. {
  150. if (sourceIsMovie())
  151. touchEventVisualizer.addPalmTouchEvent(e, getCurrentMovieFrame());
  152. else
  153. touchEventVisualizer.addPalmTouchEvent(e, videoFrame);
  154. }
  155. touchEventVisualizer.updateImage();
  156. }
  157. // add borders
  158. edgeFingerOutputImage.drawRectangle(0, 0, Width - 1, Height - 1, Color.White);
  159. depthPalmTouchOutputImage.drawRectangle(0, 0, Width - 1, Height - 1, Color.White);
  160. OutputImages = new OutputImage[] { edgeFingerOutputImage, depthPalmTouchOutputImage, touchEventVisualizer.OutputImage};
  161. Timer.stop("processFrameUpdate");
  162. }
  163. }
  164. }