private bool MatchBetaAngles(MinutiaTriplet compareTo) { for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { if (i != j) { var qMtiai = Minutiae[MtiaIdxs[i]]; var qMtiaj = Minutiae[MtiaIdxs[j]]; double x = qMtiai.X - qMtiaj.X; double y = qMtiai.Y - qMtiaj.Y; var angleij = Angle.ComputeAngle(x, y); var qBeta = Angle.DifferencePi(qMtiai.Angle, angleij); var tMtiai = compareTo.Minutiae[compareTo.MtiaIdxs[i]]; var tMtiaj = compareTo.Minutiae[compareTo.MtiaIdxs[j]]; x = tMtiai.X - tMtiaj.X; y = tMtiai.Y - tMtiaj.Y; angleij = Angle.ComputeAngle(x, y); var tBeta = Angle.DifferencePi(tMtiai.Angle, angleij); var diff = Angle.DifferencePi(qBeta, tBeta); if (diff >= BetaThreshold) { return(false); } } } } return(true); }
private bool MatchDistances(MinutiaTriplet compareTo) { var ratio = Math.Abs(D[0] - compareTo.D[0]) / Math.Min(D[0], compareTo.D[0]); if (ratio >= DistanceThreshold) { return(false); } ratio = Math.Abs(D[1] - compareTo.D[1]) / Math.Min(D[1], compareTo.D[1]); if (ratio >= DistanceThreshold) { return(false); } ratio = Math.Abs(D[2] - compareTo.D[2]) / Math.Min(D[2], compareTo.D[2]); return(!(ratio >= DistanceThreshold)); }
internal List <MinutiaTripletPair> FindAllSimilar(MinutiaTriplet queryMTp) { var result = new List <MinutiaTripletPair>(); for (var j = 0; j < MTriplets.Count; j++) { var currMTp = MTriplets[j]; if (queryMTp.Match(currMTp)) { result.Add(new MinutiaTripletPair { QueryMTp = queryMTp, TemplateMTp = currMTp } ); } } return(result.Count > 0 ? result : null); }
private bool MatchAlphaAngles(MinutiaTriplet compareTo) { var idxArr = new[] { 0, 1, 2, 0 }; for (var i = 0; i < 3; i++) { var j = idxArr[i + 1]; var qMtiai = Minutiae[MtiaIdxs[i]]; var qMtiaj = Minutiae[MtiaIdxs[j]]; var qAlpha = Angle.DifferencePi(qMtiai.Angle, qMtiaj.Angle); var tMtiai = compareTo.Minutiae[compareTo.MtiaIdxs[i]]; var tMtiaj = compareTo.Minutiae[compareTo.MtiaIdxs[j]]; var tAlpha = Angle.DifferencePi(tMtiai.Angle, tMtiaj.Angle); var diff = Angle.DifferencePi(qAlpha, tAlpha); if (diff >= AlphaThreshold) { return(false); } } return(true); }
public bool Match(MinutiaTriplet target) { return(MatchDistances(target) && MatchAlphaAngles(target) && MatchBetaAngles(target)); }
public override PartialeFeatures Extract(Bitmap image) { var minutiae = MinutiaeExtractor.ExtractFeatures(image); var result = new List <MinutiaTriplet>(); if (minutiae.Count > 3) { foreach (var triangle in Delaunay2D.Triangulate(minutiae)) { var idxArr = new[] { (short)triangle.A, (short)triangle.B, (short)triangle.C }; var newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.A, (short)triangle.C, (short)triangle.B }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.B, (short)triangle.A, (short)triangle.C }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.B, (short)triangle.C, (short)triangle.A }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.C, (short)triangle.A, (short)triangle.B }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.C, (short)triangle.B, (short)triangle.A }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); } } result.TrimExcess(); return(new PartialeFeatures(result, minutiae)); }