DebugImages.cs 6.2 KB

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