Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 public bool Match(MinutiaTriplet target)
 {
     return(MatchDistances(target) && MatchAlphaAngles(target) && MatchBetaAngles(target));
 }
Esempio n. 6
0
        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));
        }