Finger.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. namespace bbiwarg.Detectors.FingerDetection
  10. {
  11. class Finger
  12. {
  13. public Vector2D TipPoint { get { return SliceTrail.Start.Mid; } }
  14. public Vector2D HandPoint { get { return SliceTrail.End.Mid; } }
  15. public LineSegment2D LineSegment { get { return SliceTrail.LineSegment; } }
  16. public FingerSliceTrail SliceTrail { get; private set; }
  17. public Finger(FingerSliceTrail sliceTrail)
  18. {
  19. //check direction
  20. if (sliceTrail.Start.Length > sliceTrail.End.Length)
  21. sliceTrail.Slices.Reverse();
  22. SliceTrail = sliceTrail;
  23. }
  24. public Point[] getBoundingPolygon()
  25. {
  26. List<Point> pointsA = new List<Point>();
  27. List<Point> pointsB = new List<Point>();
  28. //int numSlices = SliceTrail.NumSlices;
  29. //for (int i = 0; i < numSlices; i++)
  30. foreach (FingerSlice slice in SliceTrail.Slices)
  31. {
  32. Vector2D direction = (slice.End - slice.Start).normalize();
  33. pointsA.Add(slice.Start-2*direction);
  34. pointsB.Add(slice.End+2*direction);
  35. }
  36. pointsB.Reverse();
  37. pointsA.AddRange(pointsB);
  38. return pointsA.ToArray();
  39. }
  40. //TODO: redo (not use similarity but actual distances and angle instead)
  41. public float getSimilarity(Finger compareFinger)
  42. {
  43. LineSegment2D compareLineSegment = compareFinger.LineSegment;
  44. Line2D compareLine = compareLineSegment.Line;
  45. //thresholds
  46. float thresholdMaxAngle = (float)(30 * Math.PI / 180); // 30°
  47. float thresholdMaxParallelDistance = 80;
  48. float thresholdMaxVerticalDistance = 40;
  49. //check angle
  50. float angle = LineSegment.Line.getAngleBetween(compareLine);
  51. float angleSimilarity = Math.Max(1 - angle / thresholdMaxAngle, 0);
  52. //check parallel distance
  53. float parallelDistance = LineSegment.getParallelDistanceTo(compareLineSegment);
  54. float parallelDistanceSimilarity = Math.Max(1 - parallelDistance / thresholdMaxParallelDistance, 0);
  55. //check vertical distance
  56. float verticalDistance = LineSegment.getVerticalDistanceTo(compareLineSegment);
  57. float verticalDistanceSimilarity = Math.Max(1 - verticalDistance / thresholdMaxVerticalDistance, 0);
  58. return (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3;
  59. }
  60. }
  61. }