DebugImages.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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 DebugImages
  17. {
  18. private TouchEventVisualizer touchEventVisualizer;
  19. public List<OutputImage> Images { get; private set; }
  20. public DebugImages(TouchEventVisualizer touchEventVisualizer)
  21. {
  22. Images = new List<OutputImage>();
  23. this.touchEventVisualizer = touchEventVisualizer;
  24. }
  25. public void updateImages(FrameData frameData)
  26. {
  27. Images.Clear();
  28. Images.Add(getDepthImage(frameData));
  29. Images.Add(getFingerImage(frameData));
  30. Images.Add(getHandImage(frameData));
  31. Images.Add(getPalmImage(frameData));
  32. Images.Add(touchEventVisualizer.getOutputImage());
  33. }
  34. private OutputImage getDepthImage(FrameData frameData)
  35. {
  36. OutputImage depthImage = new OutputImage(Parameters.ImageWidth, Parameters.ImageHeight);
  37. // background (depth image)
  38. depthImage.drawImage((frameData.DepthImage.MaxDepth - frameData.DepthImage.MinDepth) - frameData.DepthImage.Image, Parameters.DepthImageColor);
  39. // finger tips
  40. foreach (Finger f in frameData.TrackedFingers)
  41. {
  42. Color tipColor = (f.Touch != null) ? Parameters.TouchEventDetectedColor : Parameters.FingerTipColor;
  43. Color handColor = Parameters.FingerHandColor;
  44. depthImage.fillCircle(f.TipPoint.IntX, f.TipPoint.IntY, 5, tipColor);
  45. depthImage.fillCircle(f.HandPoint.IntX, f.HandPoint.IntY, 5, handColor);
  46. }
  47. // border
  48. depthImage.drawBorder(Parameters.OutputImageBorderColor);
  49. return depthImage;
  50. }
  51. private OutputImage getFingerImage(FrameData frameData)
  52. {
  53. OutputImage fingerImage = new OutputImage(Parameters.ImageWidth, Parameters.ImageHeight);
  54. // background (edge image)
  55. fingerImage.drawImage(frameData.EdgeImage.Image.ThresholdBinary(new Gray(0), new Gray(255)), Parameters.EdgeImageColor);
  56. // draw fingers
  57. foreach (Finger f in frameData.TrackedFingers)
  58. {
  59. foreach (FingerSlice slice in f.SliceTrail.Slices)
  60. fingerImage.drawLineSegment(slice.LineSegment, Parameters.FingerSliceColor);
  61. fingerImage.drawContour(f.getContour(Parameters.FingerContourMargin), Parameters.FingerContourColor);
  62. fingerImage.drawLineSegment(f.LineSegment, Parameters.FingerTrackedColor);
  63. fingerImage.drawText(f.MidPoint.IntX, f.MidPoint.IntY, f.TrackID.ToString(), Parameters.FingerIDColor);
  64. }
  65. //border
  66. fingerImage.drawBorder(Parameters.OutputImageBorderColor);
  67. return fingerImage;
  68. }
  69. private OutputImage getHandImage(FrameData frameData)
  70. {
  71. OutputImage handImage = new OutputImage(Parameters.ImageWidth, Parameters.ImageHeight);
  72. foreach (Hand h in frameData.TrackedHands)
  73. {
  74. handImage.drawImage(h.Mask.ThresholdBinary(new Gray(0), new Gray(255)), Parameters.HandColors[h.TrackID % Parameters.HandNumColors]);
  75. handImage.fillCircle(h.Centroid.IntX, h.Centroid.IntY, 5, Parameters.HandCentroidColor);
  76. handImage.drawText(h.Centroid.IntX, h.Centroid.IntY, h.TrackID.ToString(), Parameters.HandIDColor);
  77. if (h.Palm != null)
  78. handImage.drawDefect(h.Palm.ThumbDefect, Parameters.HandThumbDefectPointColor, Parameters.HandThumbDefectLineColor);
  79. }
  80. // border
  81. handImage.drawBorder(Parameters.OutputImageBorderColor);
  82. return handImage;
  83. }
  84. private OutputImage getPalmImage(FrameData frameData)
  85. {
  86. OutputImage palmImage = new OutputImage(Parameters.ImageWidth, Parameters.ImageHeight);
  87. // handMask
  88. Image<Gray, byte> handMask = new Image<Gray, byte>(Parameters.ImageWidth, Parameters.ImageHeight);
  89. foreach (Hand h in frameData.TrackedHands)
  90. handMask = handMask.Or(h.Mask);
  91. // background
  92. palmImage.drawImage((frameData.DepthImage.MaxDepth - frameData.DepthImage.MinDepth) - frameData.DepthImage.Image.Or(255 - handMask.ThresholdBinary(new Gray(0), new Gray(255))), Parameters.DepthImageColor);
  93. foreach (Touch t in frameData.TrackedTouches)
  94. palmImage.fillCircle(t.AbsolutePosition.IntX, t.AbsolutePosition.IntY, 5, Parameters.TouchEventTrackedColor);
  95. foreach (Palm p in frameData.TrackedPalms)
  96. palmImage.drawQuadrangleGrid(p.Quad, Parameters.PalmQuadColor, Parameters.PalmGridColor, Parameters.PalmGridNumRows, Parameters.PalmGridNumColumns);
  97. // border
  98. palmImage.drawBorder(Parameters.OutputImageBorderColor);
  99. return palmImage;
  100. }
  101. }
  102. }
  103. /*
  104. //image3
  105. OutputImages[3].drawImage((depthImage.MaxDepth - depthImage.MinDepth) - depthImage.Image.Or(255 - handDetector.HandMask.ThresholdBinary(new Gray(0), new Gray(255))), Parameters.DepthImageColor);
  106. foreach (TrackedTouch tte in touchTracker.TrackedObjects)
  107. {
  108. Vector2D position = tte.AbsolutePositionPrediction;
  109. OutputImages[3].fillCircle(position.IntX, position.IntY, 5, Parameters.TouchEventTrackedColor);
  110. }
  111. foreach (Palm p in palmTracker.OptimizedPalms)
  112. {
  113. OutputImages[3].drawQuadrangleGrid(p.Quad, Parameters.PalmQuadColor, Parameters.PalmGridColor, Parameters.PalmGridNumRows, Parameters.PalmGridNumColumns);
  114. }
  115. //image4
  116. touchEventVisualizer.updateImage();
  117. OutputImages[4] = touchEventVisualizer.OutputImage;
  118. //borders
  119. for (int i = 0; i < numImages; i++)
  120. {
  121. OutputImages[i].drawRectangle(0, 0, Parameters.ImageWidth - 1, Parameters.ImageHeight - 1, Parameters.OutputImageBorderColor);
  122. }
  123. }
  124. }
  125. }
  126. */