VideoHandle.cs 6.0 KB

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