|
@@ -49,8 +49,6 @@ namespace bbiwarg
|
|
|
private FingerTracker fingerTracker;
|
|
|
private TouchTracker touchTracker;
|
|
|
|
|
|
- private OutputImage edgeFingerOutputImage;
|
|
|
- private OutputImage depthPalmTouchOutputImage;
|
|
|
private TouchEventVisualizer touchEventVisualizer;
|
|
|
|
|
|
private int videoFrame = 0;
|
|
@@ -132,49 +130,63 @@ namespace bbiwarg
|
|
|
|
|
|
//create output images
|
|
|
Timer.start("createOtherImages");
|
|
|
- edgeFingerOutputImage = new OutputImage(Width, Height);
|
|
|
- depthPalmTouchOutputImage = new OutputImage(Width, Height);
|
|
|
+ int numImages = 4;
|
|
|
+ OutputImages = new OutputImage[numImages];
|
|
|
+ for (int i = 0; i < numImages; i++) {
|
|
|
+ OutputImages[i] = new OutputImage(Width, Height);
|
|
|
+
|
|
|
+ }
|
|
|
Timer.stop("createOtherImages");
|
|
|
|
|
|
//create depthImage
|
|
|
Timer.start("createDepthImage");
|
|
|
Image<Gray, Int16> image = new Image<Gray, Int16>(Width, Height, Width * 2, inputFrame.RawDepthData);
|
|
|
- depthImage = new DepthImage(image, depthPalmTouchOutputImage);
|
|
|
+ depthImage = new DepthImage(image);
|
|
|
+ Image<Gray, byte> tmpDepth = (depthImage.MaxDepth - depthImage.MinDepth) - depthImage.Image;
|
|
|
+ OutputImages[0].Image[0] = OutputImages[0].Image[1] = OutputImages[0].Image[2] = tmpDepth;
|
|
|
Timer.stop("createDepthImage");
|
|
|
|
|
|
// create edge image
|
|
|
Timer.start("createEdgeImage");
|
|
|
- edgeImage = new EdgeImage(depthImage, edgeFingerOutputImage);
|
|
|
+ edgeImage = new EdgeImage(depthImage);
|
|
|
+ OutputImages[1].Image[2] = edgeImage.Image.ThresholdBinary(new Gray(0), new Gray(1)).Mul(255);
|
|
|
Timer.stop("createEdgeImage");
|
|
|
|
|
|
//detect fingers
|
|
|
Timer.start("fingerDetection");
|
|
|
- fingerDetector = new FingerDetector(depthImage, edgeImage, edgeFingerOutputImage);
|
|
|
+ fingerDetector = new FingerDetector(depthImage, edgeImage, OutputImages[1]);
|
|
|
Timer.stop("fingerDetection");
|
|
|
|
|
|
//track fingers
|
|
|
Timer.start("fingerTracking");
|
|
|
- fingerTracker.setDetectedTouchEventsThisFrame(fingerDetector.Fingers, edgeFingerOutputImage);
|
|
|
+ fingerTracker.setDetectedTouchEventsThisFrame(fingerDetector.Fingers, OutputImages[1]);
|
|
|
Timer.stop("fingerTracking");
|
|
|
|
|
|
+ //remove background noise
|
|
|
+ Timer.start("removeBackground");
|
|
|
+ depthImage.removeBackground(fingerTracker.TrackedFingers);
|
|
|
+ edgeImage = new EdgeImage(depthImage);
|
|
|
+ OutputImages[2].Image[0] = OutputImages[2].Image[1] = OutputImages[2].Image[2] = (depthImage.MaxDepth - depthImage.MinDepth) - depthImage.Image;
|
|
|
+ Timer.stop("removeBackground");
|
|
|
+
|
|
|
//detect palm
|
|
|
Timer.start("palmDetection");
|
|
|
if (fingerTracker.TrackedFingers.Count >= 2)
|
|
|
- palmDetector.findPalmQuad(depthImage, edgeImage, depthPalmTouchOutputImage, fingerTracker.TrackedFingers);
|
|
|
+ palmDetector.findPalmQuad(depthImage, edgeImage, OutputImages[2], fingerTracker.TrackedFingers);
|
|
|
if (CurrentFrame == 0)
|
|
|
palmDetector.resetFilters();
|
|
|
Timer.stop("palmDetection");
|
|
|
|
|
|
//detect touchEvents
|
|
|
Timer.start("touchDetection");
|
|
|
- touchDetector = new TouchDetector(fingerTracker.TrackedFingers, depthImage, depthPalmTouchOutputImage);
|
|
|
+ touchDetector = new TouchDetector(fingerTracker.TrackedFingers, depthImage, OutputImages[2]);
|
|
|
if (palmDetector.PalmQuad != null)
|
|
|
palmTouchDetector = new PalmTouchDetector(touchDetector.TouchEvents, palmDetector.PalmQuad);
|
|
|
Timer.stop("touchDetection");
|
|
|
|
|
|
//track touchEvents
|
|
|
Timer.start("touchTracking");
|
|
|
- touchTracker.setDetectedTouchEventsThisFrame(touchDetector.TouchEvents, depthPalmTouchOutputImage);
|
|
|
+ touchTracker.setDetectedTouchEventsThisFrame(touchDetector.TouchEvents, OutputImages[2]);
|
|
|
Timer.stop("touchTracking");
|
|
|
|
|
|
// touch event visualizer
|
|
@@ -187,12 +199,16 @@ namespace bbiwarg
|
|
|
foreach (PalmTouchEvent e in palmTouchDetector.PalmTouchEvents)
|
|
|
touchEventVisualizer.addPalmTouchEvent(e, CurrentFrame);
|
|
|
touchEventVisualizer.updateImage();
|
|
|
+ OutputImages[3] = touchEventVisualizer.OutputImage;
|
|
|
}
|
|
|
|
|
|
// add borders
|
|
|
- edgeFingerOutputImage.drawRectangle(0, 0, Width - 1, Height - 1, Color.White);
|
|
|
- depthPalmTouchOutputImage.drawRectangle(0, 0, Width - 1, Height - 1, Color.White);
|
|
|
- OutputImages = new OutputImage[] { edgeFingerOutputImage, depthPalmTouchOutputImage, touchEventVisualizer.OutputImage};
|
|
|
+ for (int i = 0; i < numImages; i++)
|
|
|
+ {
|
|
|
+ OutputImages[i].drawRectangle(0, 0, Width - 1, Height - 1, Color.White);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
Timer.stop("processFrameUpdate");
|
|
|
}
|
|
|
}
|