using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using bbiwarg.Images; using bbiwarg.Utility; using Emgu.CV; namespace bbiwarg.Recognition.FingerRecognition { class Finger { public Vector2D TipPoint { get { return SliceTrail.StartSlice.Mid; } } public Vector2D HandPoint { get { return SliceTrail.EndSlice.Mid; } } public Vector2D Direction { get { return LineSegment.Direction; } } public LineSegment2D LineSegment { get { return SliceTrail.LineSegment; } } public FingerSliceTrail SliceTrail { get; private set; } public Contour Contour { get { return SliceTrail.getContour(); } } public Finger(FingerSliceTrail sliceTrail) { //check direction if (sliceTrail.StartSlice.Length > sliceTrail.EndSlice.Length) sliceTrail.reverse(); SliceTrail = sliceTrail; } //TODO: redo (not use similarity but actual distances and angle instead) public float getSimilarity(Finger compareFinger) { LineSegment2D compareLineSegment = compareFinger.LineSegment; Line2D compareLine = compareLineSegment.Line; //thresholds float thresholdMaxAngle = (float)(30 * Math.PI / 180); // 30° float thresholdMaxParallelDistance = 80; float thresholdMaxVerticalDistance = 40; //check angle float angle = LineSegment.Line.getAngleBetween(compareLine); float angleSimilarity = Math.Max(1 - angle / thresholdMaxAngle, 0); //check parallel distance float parallelDistance = LineSegment.getParallelDistanceTo(compareLineSegment); float parallelDistanceSimilarity = Math.Max(1 - parallelDistance / thresholdMaxParallelDistance, 0); //check vertical distance float verticalDistance = LineSegment.getVerticalDistanceTo(compareLineSegment); float verticalDistanceSimilarity = Math.Max(1 - verticalDistance / thresholdMaxVerticalDistance, 0); return (angleSimilarity + parallelDistanceSimilarity + verticalDistanceSimilarity) / 3; } } }