VideoHandle.cs 5.7 KB

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