DebugImageCreator.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Drawing;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using bbiwarg.Input.InputHandling;
  8. using bbiwarg.Recognition.FingerRecognition;
  9. using bbiwarg.Recognition.HandRecognition;
  10. using bbiwarg.Recognition.PalmRecognition;
  11. using bbiwarg.Recognition.TouchRecognition;
  12. using Emgu.CV.Structure;
  13. using Emgu.CV;
  14. namespace bbiwarg.Output.DebugOutput
  15. {
  16. class DebugImageCreator
  17. {
  18. private TouchEventVisualizer touchEventVisualizer;
  19. public OutputImage DepthImage { get; private set; }
  20. public OutputImage FingerImage { get; private set; }
  21. public OutputImage HandImage { get; private set; }
  22. public OutputImage PalmImage { get; private set; }
  23. public OutputImage TouchImage { get; private set; }
  24. public DebugImageCreator(TouchEventVisualizer touchEventVisualizer)
  25. {
  26. this.touchEventVisualizer = touchEventVisualizer;
  27. }
  28. public void updateImages(FrameData frameData, int palmGridNumRows, int palmGridNumColumns)
  29. {
  30. updateDepthImage(frameData);
  31. updateFingerImage(frameData);
  32. updateHandImage(frameData);
  33. updatePalmImage(frameData, palmGridNumRows, palmGridNumColumns);
  34. updateTouchImage(frameData, palmGridNumRows, palmGridNumColumns);
  35. }
  36. private void updateDepthImage(FrameData frameData)
  37. {
  38. if (DepthImage != null)
  39. DepthImage.Dispose();
  40. DepthImage = new OutputImage(frameData.ImageSize);
  41. // background (depth image)
  42. DepthImage.drawImage((frameData.DepthImage.MaxDepth - frameData.DepthImage.MinDepth) - frameData.DepthImage.Image, Parameters.DepthImageColor);
  43. // finger tips
  44. foreach (Finger f in frameData.TrackedFingers)
  45. {
  46. Color tipColor = (f.Touch != null) ? Parameters.TouchEventDetectedColor : Parameters.FingerTipColor;
  47. Color handColor = Parameters.FingerHandColor;
  48. DepthImage.fillCircle(f.TipPoint, 5, tipColor);
  49. DepthImage.fillCircle(f.HandPoint, 5, handColor);
  50. }
  51. // border
  52. DepthImage.drawBorder(Parameters.OutputImageBorderColor);
  53. }
  54. private void updateFingerImage(FrameData frameData)
  55. {
  56. if (FingerImage != null)
  57. FingerImage.Dispose();
  58. FingerImage = new OutputImage(frameData.ImageSize);
  59. // background (edge image)
  60. FingerImage.drawImage(frameData.EdgeImage.Image.ThresholdBinary(new Gray(0), new Gray(255)), Parameters.EdgeImageColor);
  61. // draw fingers
  62. foreach (Finger f in frameData.TrackedFingers)
  63. {
  64. foreach (FingerSlice slice in f.SliceTrail.Slices)
  65. FingerImage.drawLineSegment(slice.LineSegment, Parameters.FingerSliceColor);
  66. FingerImage.drawContour(f.getContour(Parameters.FingerContourMargin), Parameters.FingerContourColor);
  67. FingerImage.drawLineSegment(f.LineSegment, Parameters.FingerTrackedColor);
  68. FingerImage.drawText(f.MidPoint, f.TrackID.ToString(), Parameters.FingerIDColor);
  69. }
  70. //border
  71. FingerImage.drawBorder(Parameters.OutputImageBorderColor);
  72. }
  73. private void updateHandImage(FrameData frameData)
  74. {
  75. if (HandImage != null)
  76. HandImage.Dispose();
  77. HandImage = new OutputImage(frameData.ImageSize);
  78. foreach (Hand h in frameData.TrackedHands)
  79. {
  80. HandImage.drawImage(h.Mask.ThresholdBinary(new Gray(0), new Gray(255)), Parameters.HandColors[h.TrackID % Parameters.HandNumColors]);
  81. HandImage.fillCircle(h.Centroid, 5, Parameters.HandCentroidColor);
  82. HandImage.drawText(h.Centroid, h.TrackID.ToString(), Parameters.HandIDColor);
  83. if (h.Palm != null)
  84. HandImage.drawDefect(h.Palm.ThumbDefect, Parameters.HandThumbDefectPointColor, Parameters.HandThumbDefectLineColor);
  85. }
  86. // border
  87. HandImage.drawBorder(Parameters.OutputImageBorderColor);
  88. }
  89. private void updatePalmImage(FrameData frameData, int numRows, int numColumns)
  90. {
  91. if (PalmImage != null)
  92. PalmImage.Dispose();
  93. PalmImage = new OutputImage(frameData.ImageSize);
  94. // handMask
  95. Image<Gray, byte> handMask = new Image<Gray, byte>(frameData.ImageSize.Width, frameData.ImageSize.Height);
  96. foreach (Hand h in frameData.TrackedHands)
  97. handMask = handMask.Or(h.Mask);
  98. // background
  99. PalmImage.drawImage((frameData.DepthImage.MaxDepth - frameData.DepthImage.MinDepth) - frameData.DepthImage.Image.Or(255 - handMask.ThresholdBinary(new Gray(0), new Gray(255))), Parameters.DepthImageColor);
  100. foreach (Touch t in frameData.TrackedTouches)
  101. PalmImage.fillCircle(t.AbsolutePosition, 5, Parameters.TouchEventTrackedColor);
  102. foreach (Palm p in frameData.TrackedPalms)
  103. PalmImage.drawQuadrangleGrid(p.Quad, Parameters.PalmQuadColor, Parameters.PalmGridColor, numRows, numColumns);
  104. // border
  105. PalmImage.drawBorder(Parameters.OutputImageBorderColor);
  106. }
  107. private void updateTouchImage(FrameData frameData, int numRows, int numColumns) {
  108. if (TouchImage != null)
  109. TouchImage.Dispose();
  110. TouchImage = touchEventVisualizer.getOutputImage(frameData.ImageSize, numRows, numColumns);
  111. }
  112. }
  113. }