using System; using System.Collections.Generic; using System.Linq; using System.Drawing; using System.Text; using System.Threading.Tasks; using bbiwarg.Input.InputHandling; using bbiwarg.Recognition.FingerRecognition; using bbiwarg.Recognition.HandRecognition; using bbiwarg.Recognition.PalmRecognition; using bbiwarg.Recognition.TouchRecognition; using Emgu.CV.Structure; using Emgu.CV; namespace bbiwarg.Output.DebugOutput { class DebugImageCreator { private TouchEventVisualizer touchEventVisualizer; public OutputImage DepthImage { get; private set; } public OutputImage FingerImage { get; private set; } public OutputImage HandImage { get; private set; } public OutputImage PalmImage { get; private set; } public OutputImage TouchImage { get; private set; } public DebugImageCreator(TouchEventVisualizer touchEventVisualizer) { this.touchEventVisualizer = touchEventVisualizer; } public void updateImages(FrameData frameData, int palmGridNumRows, int palmGridNumColumns) { updateDepthImage(frameData); updateFingerImage(frameData); updateHandImage(frameData); updatePalmImage(frameData, palmGridNumRows, palmGridNumColumns); updateTouchImage(frameData, palmGridNumRows, palmGridNumColumns); } private void updateDepthImage(FrameData frameData) { if (DepthImage != null) DepthImage.Dispose(); DepthImage = new OutputImage(frameData.ImageSize); // background (depth image) DepthImage.drawImage((frameData.DepthImage.MaxDepth - frameData.DepthImage.MinDepth) - frameData.DepthImage.Image, Parameters.DepthImageColor); // finger tips foreach (Finger f in frameData.TrackedFingers) { Color tipColor = (f.Touch != null) ? Parameters.TouchEventDetectedColor : Parameters.FingerTipColor; Color handColor = Parameters.FingerHandColor; DepthImage.fillCircle(f.TipPoint, 5, tipColor); DepthImage.fillCircle(f.HandPoint, 5, handColor); } // border DepthImage.drawBorder(Parameters.OutputImageBorderColor); } private void updateFingerImage(FrameData frameData) { if (FingerImage != null) FingerImage.Dispose(); FingerImage = new OutputImage(frameData.ImageSize); // background (edge image) FingerImage.drawImage(frameData.EdgeImage.Image.ThresholdBinary(new Gray(0), new Gray(255)), Parameters.EdgeImageColor); // draw fingers foreach (Finger f in frameData.TrackedFingers) { foreach (FingerSlice slice in f.SliceTrail.Slices) FingerImage.drawLineSegment(slice.LineSegment, Parameters.FingerSliceColor); FingerImage.drawContour(f.getContour(Parameters.FingerContourMargin), Parameters.FingerContourColor); FingerImage.drawLineSegment(f.LineSegment, Parameters.FingerTrackedColor); FingerImage.drawText(f.MidPoint, f.TrackID.ToString(), Parameters.FingerIDColor); } //border FingerImage.drawBorder(Parameters.OutputImageBorderColor); } private void updateHandImage(FrameData frameData) { if (HandImage != null) HandImage.Dispose(); HandImage = new OutputImage(frameData.ImageSize); foreach (Hand h in frameData.TrackedHands) { HandImage.drawImage(h.Mask.ThresholdBinary(new Gray(0), new Gray(255)), Parameters.HandColors[h.TrackID % Parameters.HandNumColors]); HandImage.fillCircle(h.Centroid, 5, Parameters.HandCentroidColor); HandImage.drawText(h.Centroid, h.TrackID.ToString(), Parameters.HandIDColor); if (h.Palm != null) HandImage.drawDefect(h.Palm.ThumbDefect, Parameters.HandThumbDefectPointColor, Parameters.HandThumbDefectLineColor); } // border HandImage.drawBorder(Parameters.OutputImageBorderColor); } private void updatePalmImage(FrameData frameData, int numRows, int numColumns) { if (PalmImage != null) PalmImage.Dispose(); PalmImage = new OutputImage(frameData.ImageSize); // handMask Image handMask = new Image(frameData.ImageSize.Width, frameData.ImageSize.Height); foreach (Hand h in frameData.TrackedHands) handMask = handMask.Or(h.Mask); // background PalmImage.drawImage((frameData.DepthImage.MaxDepth - frameData.DepthImage.MinDepth) - frameData.DepthImage.Image.Or(255 - handMask.ThresholdBinary(new Gray(0), new Gray(255))), Parameters.DepthImageColor); foreach (Touch t in frameData.TrackedTouches) PalmImage.fillCircle(t.AbsolutePosition, 5, Parameters.TouchEventTrackedColor); foreach (Palm p in frameData.TrackedPalms) PalmImage.drawQuadrangleGrid(p.Quad, Parameters.PalmQuadColor, Parameters.PalmGridColor, numRows, numColumns); // border PalmImage.drawBorder(Parameters.OutputImageBorderColor); } private void updateTouchImage(FrameData frameData, int numRows, int numColumns) { if (TouchImage != null) TouchImage.Dispose(); TouchImage = touchEventVisualizer.getOutputImage(frameData.ImageSize, numRows, numColumns); } } }