Finger.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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 bbiwarg.Images;
  8. using bbiwarg.Utility;
  9. using Emgu.CV;
  10. namespace bbiwarg.Recognition.FingerRecognition
  11. {
  12. class Finger
  13. {
  14. public Vector2D TipPoint { get { return SliceTrail.StartSlice.Mid; } }
  15. public Vector2D HandPoint { get { return SliceTrail.EndSlice.Mid; } }
  16. public Vector2D Direction { get { return LineSegment.Direction; } }
  17. public LineSegment2D LineSegment { get { return SliceTrail.LineSegment; } }
  18. public FingerSliceTrail SliceTrail { get; private set; }
  19. public Contour<Point> Contour { get { return SliceTrail.getContour(); } }
  20. public Finger(FingerSliceTrail sliceTrail)
  21. {
  22. //check direction
  23. if (sliceTrail.StartSlice.Length > sliceTrail.EndSlice.Length)
  24. sliceTrail.reverse();
  25. SliceTrail = sliceTrail;
  26. }
  27. //TODO: redo (not use similarity but actual distances and angle instead)
  28. public float getSimilarity(Finger compareFinger)
  29. {
  30. LineSegment2D compareLineSegment = compareFinger.LineSegment;
  31. Line2D compareLine = compareLineSegment.Line;
  32. //thresholds
  33. float thresholdMaxAngle = (float)(30 * Math.PI / 180); // 30°
  34. float thresholdMaxParallelDistance = 80;
  35. float thresholdMaxVerticalDistance = 40;
  36. //check angle
  37. float angle = LineSegment.Line.getAngleBetween(compareLine);
  38. float angleSimilarity = Math.Max(1 - angle / thresholdMaxAngle, 0);
  39. //check parallel distance
  40. float parallelDistance = LineSegment.getParallelDistanceTo(compareLineSegment);
  41. float parallelDistanceSimilarity = Math.Max(1 - parallelDistance / thresholdMaxParallelDistance, 0);
  42. //check vertical distance
  43. float verticalDistance = LineSegment.getVerticalDistanceTo(compareLineSegment);
  44. float verticalDistanceSimilarity = Math.Max(1 - verticalDistance / thresholdMaxVerticalDistance, 0);
  45. return (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3;
  46. }
  47. }
  48. }