using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using bbiwarg.Detectors.Fingers; using bbiwarg.Detectors.Touch; using bbiwarg.Images; using bbiwarg.InputProviders; using Emgu.CV; using Emgu.CV.Structure; namespace bbiwarg { class VideoHandle { private IInputProvider inputProvider; private InputFrame inputFrame; private int width; private int height; private DepthImage depthImage; private EdgeImage edgeImage; private TouchImage touchImage; private PalmImage palmImage; private FingerImage fingerImage; private FingerDetector fingerDetector; private TouchDetector touchDetector; private FingerTracker fingerTracker; private TouchTracker touchTracker; public VideoHandle(IInputProvider inputProvider) { this.inputProvider = inputProvider; //initialize trackers touchTracker = new TouchTracker(); fingerTracker = new FingerTracker(); } public void start() { inputProvider.init(); inputProvider.start(); inputProvider.updateFrame(); processFrameUpdate(); } public void stop() { inputProvider.stop(); } public void nextFrame() { if (inputProvider.isActive()) { inputProvider.releaseFrame(); inputProvider.updateFrame(); processFrameUpdate(); } else { inputProvider.stop(); } } public int getWidth() { return width; } public int getHeight() { return height; } public Int16 getDepthAt(int x, int y) { return depthImage.getDepthAt(x, y); } public float getRelativeDepth(int x, int y) { return depthImage.getRelativeDepth(x, y); } public bool isEdgeAt(int x, int y) { return edgeImage.isEdgeAt(x, y); } public FingerImageState getFingerImageStateAt(int x, int y) { return fingerImage.getStateAt(x, y); } public bool isPalmPointAt(int x, int y) { return palmImage.belongsToPalm(x, y); } public TouchImageState getTouchImageStateAt(int x, int y) { return touchImage.getStateAt(x, y); } private void processFrameUpdate() { //read data from inputProvider inputFrame = inputProvider.getInputFrame(); width = inputFrame.getWidth(); height = inputFrame.getHeight(); //create depthImage Image image = new Image(width, height); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.Data[y, x, 0] = inputFrame.getDepthAt(x, y); } } depthImage = new DepthImage(width, height, image); //create images edgeImage = new EdgeImage(depthImage); palmImage = new PalmImage(edgeImage); touchImage = new TouchImage(width, height); fingerImage = new FingerImage(width, height); //detect+track fingers fingerDetector = new FingerDetector(depthImage, edgeImage, fingerImage); fingerTracker.setDetectedTouchEventsThisFrame(fingerDetector.getFingers(), fingerImage); //detect+track touchEvents touchDetector = new TouchDetector(fingerTracker.getFingers(), depthImage, touchImage); touchTracker.setDetectedTouchEventsThisFrame(touchDetector.getTouchEvents(), touchImage); } } }