VideoHandle.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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.Detectors.Fingers;
  8. using bbiwarg.Detectors.Touch;
  9. using bbiwarg.Images;
  10. using bbiwarg.InputProviders;
  11. using Emgu.CV;
  12. using Emgu.CV.Structure;
  13. namespace bbiwarg
  14. {
  15. class VideoHandle
  16. {
  17. private IInputProvider inputProvider;
  18. private InputFrame inputFrame;
  19. private int width;
  20. private int height;
  21. private DepthImage depthImage;
  22. private EdgeImage edgeImage;
  23. private TouchImage touchImage;
  24. private FingerImage fingerImage;
  25. private FingerDetector fingerDetector;
  26. private TouchDetector touchDetector;
  27. private FingerTracker fingerTracker;
  28. private TouchTracker touchTracker;
  29. public VideoHandle(IInputProvider inputProvider) {
  30. this.inputProvider = inputProvider;
  31. //initialize trackers
  32. touchTracker = new TouchTracker();
  33. fingerTracker = new FingerTracker();
  34. }
  35. public void start() {
  36. inputProvider.init();
  37. inputProvider.start();
  38. inputProvider.updateFrame();
  39. processFrameUpdate();
  40. }
  41. public void stop() {
  42. inputProvider.stop();
  43. }
  44. public void nextFrame()
  45. {
  46. if (inputProvider.isActive())
  47. {
  48. inputProvider.releaseFrame();
  49. inputProvider.updateFrame();
  50. processFrameUpdate();
  51. }
  52. else
  53. {
  54. inputProvider.stop();
  55. }
  56. }
  57. public int getWidth()
  58. {
  59. return width;
  60. }
  61. public int getHeight()
  62. {
  63. return height;
  64. }
  65. public Int16 getDepthAt(int x, int y) {
  66. return depthImage.getDepthAt(x, y);
  67. }
  68. public float getRelativeDepth(int x, int y) {
  69. return depthImage.getRelativeDepth(x, y);
  70. }
  71. public bool isEdgeAt(int x, int y) {
  72. return edgeImage.isEdgeAt(x, y);
  73. }
  74. public FingerImageState getFingerImageStateAt(int x, int y) {
  75. return fingerImage.getStateAt(x, y);
  76. }
  77. public TouchImageState getTouchImageStateAt(int x, int y) {
  78. return touchImage.getStateAt(x, y);
  79. }
  80. private void processFrameUpdate()
  81. {
  82. //read data from inputProvider
  83. inputFrame = inputProvider.getInputFrame();
  84. width = inputFrame.getWidth();
  85. height = inputFrame.getHeight();
  86. //create depthImage
  87. Image<Gray, Int16> image = new Image<Gray, Int16>(width, height);
  88. for (int x = 0; x < width; x++) {
  89. for (int y = 0; y < height; y++) {
  90. image.Data[y, x, 0] = inputFrame.getDepthAt(x, y);
  91. }
  92. }
  93. depthImage = new DepthImage(width, height, image);
  94. //create images
  95. edgeImage = new EdgeImage(depthImage);
  96. touchImage = new TouchImage(depthImage);
  97. fingerImage = new FingerImage(depthImage);
  98. //detect+track fingers
  99. fingerDetector = new FingerDetector(depthImage, edgeImage, fingerImage);
  100. fingerTracker.setDetectedTouchEventsThisFrame(fingerDetector.getFingers(), fingerImage);
  101. //detect+track touchEvents
  102. touchDetector = new TouchDetector(fingerTracker.getFingers(), depthImage, touchImage);
  103. touchTracker.setDetectedTouchEventsThisFrame(touchDetector.getTouchEvents(), touchImage);
  104. }
  105. }
  106. }