VideoHandle.cs 3.8 KB

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