Finger.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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.Images;
  10. using bbiwarg.Utility;
  11. namespace bbiwarg.Detectors.Fingers
  12. {
  13. class Finger
  14. {
  15. private FingerSliceTrail sliceTrail;
  16. public Vector2D Tip { get { return sliceTrail.Start.Mid; } }
  17. public Vector2D Hand { get { return sliceTrail.End.Mid; } }
  18. public Line2D Line { get { return sliceTrail.Line; } }
  19. public FingerSliceTrail SliceTrail { get { return sliceTrail; } private set { sliceTrail = value; } }
  20. public Finger(FingerSliceTrail sliceTrail)
  21. {
  22. SliceTrail = sliceTrail;
  23. }
  24. public float getSimilarity(Finger compareFinger)
  25. {
  26. Line2D compareLine = compareFinger.Line;
  27. //thresholds
  28. float thresholdMaxAngle = (float)(30 * Math.PI / 180); // 30°
  29. float thresholdMaxParallelDistance = 40;
  30. float thresholdMaxVerticalDistance = 40;
  31. //check angle
  32. float angle = Line.getAngleBetween(compareLine);
  33. float angleSimilarity = Math.Max(1 - angle / thresholdMaxAngle, 0);
  34. //check parallel distance
  35. float parallelDistance = Line.getParallelDistanceTo(compareLine);
  36. float parallelDistanceSimilarity = Math.Max(1 - parallelDistance / thresholdMaxParallelDistance, 0);
  37. //check vertical distance
  38. float verticalDistance = Line.getVerticalDistanceTo(compareLine);
  39. float verticalDistanceSimilarity = Math.Max(1 - verticalDistance / thresholdMaxVerticalDistance, 0);
  40. return (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3;
  41. }
  42. }
  43. }