Hand.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Emgu.CV;
  8. using Emgu.CV.Structure;
  9. using bbiwarg.Recognition.FingerRecognition;
  10. using bbiwarg.Utility;
  11. using bbiwarg.Recognition.Tracking;
  12. using bbiwarg.Recognition.PalmRecognition;
  13. namespace bbiwarg.Recognition.HandRecognition
  14. {
  15. class Hand : TrackableObject
  16. {
  17. public Vector2D Centroid { get; private set; }
  18. public Image<Gray, byte> Mask { get; private set; }
  19. public List<Finger> Fingers { get; private set; }
  20. public Palm Palm { get; set; }
  21. public Hand(Image<Gray, byte> mask, List<Finger> fingers)
  22. {
  23. Mask = mask;
  24. Fingers = fingers;
  25. foreach (Finger finger in Fingers)
  26. finger.Hand = this;
  27. }
  28. public bool isInside(Vector2D point)
  29. {
  30. return (Mask.Data[point.IntY, point.IntX, 0] != 0);
  31. }
  32. public void mergeWith(Hand mergeHand)
  33. {
  34. extendMask(mergeHand.Mask);
  35. Fingers.AddRange(mergeHand.Fingers);
  36. foreach (Finger finger in mergeHand.Fingers)
  37. finger.Hand = this;
  38. }
  39. public void extendMask(Image<Gray, byte> extendMask)
  40. {
  41. Mask = Mask.Or(extendMask);
  42. }
  43. public void fillOverlappingFingers(List<Finger> otherFingers)
  44. {
  45. foreach (Finger finger in otherFingers)
  46. {
  47. FingerSliceTrail trail = null;
  48. foreach (FingerSlice slice in finger.SliceTrail.Slices)
  49. {
  50. Vector2D out1 = slice.Start.moveWithinBound(slice.Direction.getInverse(), Parameters.FingerContourMargin);
  51. Vector2D out2 = slice.End.moveWithinBound(slice.Direction, Parameters.FingerContourMargin);
  52. if (isInside(out1) && isInside(out2))
  53. {
  54. if (trail == null)
  55. trail = new FingerSliceTrail(slice);
  56. else
  57. trail.addSlice(slice);
  58. }
  59. }
  60. if (trail != null)
  61. Mask.FillConvexPoly(trail.getContour(Parameters.FingerOutMargin).ToArray(), new Gray(1));
  62. }
  63. Mask = Mask.Dilate(1);
  64. }
  65. public void findCentroid()
  66. {
  67. MCvPoint2D64f gravityCenter = Mask.GetMoments(true).GravityCenter;
  68. Centroid = new Vector2D((float)gravityCenter.x, (float)gravityCenter.y);
  69. }
  70. }
  71. }