FingerSliceTrail.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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.Utility;
  8. using Emgu.CV;
  9. namespace bbiwarg.Recognition.FingerRecognition
  10. {
  11. class FingerSliceTrail
  12. {
  13. private List<FingerSlice> slices;
  14. private List<Point> pointsA;
  15. private List<Point> pointsB;
  16. public FingerSlice StartSlice { get { return slices[0]; } }
  17. public FingerSlice MidSlice { get { return slices[NumSlices / 2]; } }
  18. public FingerSlice EndSlice { get { return slices[slices.Count - 1]; } }
  19. public FingerSlice this[int index] { get { return slices[index]; } }
  20. public int NumSlices { get { return slices.Count; } }
  21. public LineSegment2D LineSegment { get; private set; }
  22. public FingerSliceTrail(FingerSlice slice)
  23. {
  24. slices = new List<FingerSlice>();
  25. pointsA = new List<Point>();
  26. pointsB = new List<Point>();
  27. addSlice(slice);
  28. }
  29. public void addSlice(FingerSlice slice)
  30. {
  31. slices.Add(slice);
  32. pointsA.Add(slice.Start - Constants.FingerContourMargin * slice.Direction);
  33. pointsB.Add(slice.End + Constants.FingerContourMargin * slice.Direction);
  34. pointsA.Add(slice.Start);
  35. LineSegment = new LineSegment2D(StartSlice.Mid, slice.Mid);
  36. }
  37. public Vector2D getStartDirection()
  38. {
  39. int innerStartIndex = Math.Min(NumSlices, Constants.FingerNumSlicesForRelativeDirection);
  40. return (StartSlice.Mid - slices[innerStartIndex].Mid).normalize();
  41. }
  42. public Vector2D getEndDirection()
  43. {
  44. int innerEndIndex = Math.Max(0, NumSlices - Constants.FingerNumSlicesForRelativeDirection);
  45. return (EndSlice.Mid - slices[innerEndIndex].Mid).normalize();
  46. }
  47. public void removeFirstSlices(int numSlices)
  48. {
  49. slices.RemoveRange(0, numSlices);
  50. pointsA.RemoveRange(0, numSlices);
  51. pointsB.RemoveRange(0, numSlices);
  52. LineSegment = new LineSegment2D(StartSlice.Mid, EndSlice.Mid);
  53. }
  54. public void reverse() {
  55. slices.Reverse();
  56. pointsA.Reverse();
  57. pointsB.Reverse();
  58. List<Point> dummy = pointsA;
  59. pointsA = pointsB;
  60. pointsB = dummy;
  61. LineSegment = new LineSegment2D(StartSlice.Mid, EndSlice.Mid);
  62. }
  63. public Contour<Point> getContour()
  64. {
  65. pointsA.Reverse();
  66. List<Point> points = new List<Point>();
  67. points.AddRange(pointsA);
  68. points.AddRange(pointsB);
  69. pointsA.Reverse();
  70. Contour<Point> contour = new Contour<Point>(new MemStorage());
  71. foreach (Point p in points)
  72. {
  73. contour.Push(p);
  74. }
  75. return contour;
  76. }
  77. }
  78. }