VideoHandle.cs 6.2 KB

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