コード例 #1
0
        private List <MinutiaPair> GetGlobalMatchingMtiae(IList <MinutiaPair> localMatchingPairs, MinutiaPair refMtiaPair)
        {
            var globalMatchingMtiae = new List <MinutiaPair>(localMatchingPairs.Count);
            var qMatches            = new Dictionary <Minutia, Minutia>(localMatchingPairs.Count);
            var tMatches            = new Dictionary <Minutia, Minutia>(localMatchingPairs.Count);

            qMatches.Add(refMtiaPair.QueryMtia, refMtiaPair.TemplateMtia);
            tMatches.Add(refMtiaPair.TemplateMtia, refMtiaPair.QueryMtia);

            MtiaMapper mm          = new MtiaMapper(refMtiaPair.QueryMtia, refMtiaPair.TemplateMtia);
            Minutia    refQuery    = mm.Map(refMtiaPair.QueryMtia);
            Minutia    refTemplate = refMtiaPair.TemplateMtia;

            for (int i = 1; i < localMatchingPairs.Count; i++)
            {
                MinutiaPair mtiaPair = localMatchingPairs[i];
                if (!qMatches.ContainsKey(mtiaPair.QueryMtia) && !tMatches.ContainsKey(mtiaPair.TemplateMtia))
                {
                    Minutia query    = mm.Map(mtiaPair.QueryMtia);
                    Minutia template = mtiaPair.TemplateMtia;
                    if (MatchDistance(refQuery, refTemplate, query, template) && MatchDirections(query, template) && MatchPosition(refQuery, refTemplate, query, template))
                    {
                        globalMatchingMtiae.Add(mtiaPair);
                        qMatches.Add(mtiaPair.QueryMtia, mtiaPair.TemplateMtia);
                        tMatches.Add(mtiaPair.TemplateMtia, mtiaPair.QueryMtia);
                    }
                }
            }
            globalMatchingMtiae.Add(refMtiaPair);
            return(globalMatchingMtiae);
        }
コード例 #2
0
        public static double Compare(Minutia m0, Minutia m1)
        {
            double diff0 = m0.Y - m1.Y;
            double diff1 = m0.X - m1.X;

            return(Math.Sqrt(diff0 * diff0 + diff1 * diff1));
        }
コード例 #3
0
        /// <summary>
        ///     Extract features of type <see cref="JYFeatures"/> from the specified minutiae and skeleton image.
        /// </summary>
        /// <param name="minutiae">
        ///     The minutia list to extract the features from.
        /// </param>
        /// <param name="skeletonImg">
        ///     The skeleton image to extract the features from.
        /// </param>
        /// <returns>
        ///     Features of type <see cref="JYFeatures"/> extracted from the specified minutiae and skeleton image.
        /// </returns>
        public JYFeatures ExtractFeatures(List <Minutia> minutiae, SkeletonImage skeletonImg)
        {
            var descriptorsList = new List <JYMtiaDescriptor>();

            if (minutiae.Count > 3)
            {
                var mtiaIdx = new Dictionary <Minutia, int>();
                for (int i = 0; i < minutiae.Count; i++)
                {
                    mtiaIdx.Add(minutiae[i], i);
                }
                for (Int16 idx = 0; idx < minutiae.Count; idx++)
                {
                    Minutia query   = minutiae[idx];
                    Int16[] nearest = GetNearest(minutiae, query);
                    for (int i = 0; i < nearest.Length - 1; i++)
                    {
                        for (int j = i + 1; j < nearest.Length; j++)
                        {
                            JYMtiaDescriptor newMTriplet = new JYMtiaDescriptor(skeletonImg, minutiae, idx, nearest[i],
                                                                                nearest[j]);
                            descriptorsList.Add(newMTriplet);
                        }
                    }
                }
                descriptorsList.TrimExcess();
            }
            return(new JYFeatures(descriptorsList));
        }
コード例 #4
0
        public MTriplet(Int16[] mIdxs, List <Minutia> minutiae)
        {
            this.minutiae = minutiae;

            mtiaIdxs = ArrangeClockwise(mIdxs, minutiae);

            Minutia[] mtiaArr = new Minutia[3];
            mtiaArr[0] = minutiae[MtiaIdxs[0]];
            mtiaArr[1] = minutiae[MtiaIdxs[1]];
            mtiaArr[2] = minutiae[MtiaIdxs[2]];

            // Computing distances and maxBeta angle
            d[0]    = ed.Compare(mtiaArr[0], mtiaArr[1]);
            d[1]    = ed.Compare(mtiaArr[1], mtiaArr[2]);
            d[2]    = ed.Compare(mtiaArr[0], mtiaArr[2]);
            maxBeta = double.MinValue;
            for (byte i = 0; i < 2; i++)
            {
                for (byte j = (byte)(i + 1); j < 3; j++)
                {
                    if (d[sortedDistIdxs[i]] > d[sortedDistIdxs[j]])
                    {
                        byte temp = sortedDistIdxs[i];
                        sortedDistIdxs[i] = sortedDistIdxs[j];
                        sortedDistIdxs[j] = temp;
                    }
                    double alpha    = mtiaArr[i].Angle;
                    double beta     = mtiaArr[j].Angle;
                    double diff     = Math.Abs(beta - alpha);
                    double currBeta = Math.Min(diff, 2 * Math.PI - diff);
                    maxBeta = Math.Max(maxBeta, Math.Max(currBeta, currBeta));
                }
            }
        }
コード例 #5
0
        public object Clone()
        {
            SkeletonBuilder clone = new SkeletonBuilder();

            Dictionary<Minutia, Minutia> minutiaClones = new Dictionary<Minutia, Minutia>();
            foreach (Minutia minutia in AllMinutiae)
            {
                Minutia minutiaClone = new Minutia(minutia.Position);
                minutiaClone.Valid = minutia.Valid;
                clone.AddMinutia(minutiaClone);
                minutiaClones[minutia] = minutiaClone;
            }

            Dictionary<Ridge, Ridge> ridgeClones = new Dictionary<Ridge, Ridge>();
            foreach (Minutia minutia in AllMinutiae)
            {
                foreach (Ridge ridge in minutia.Ridges)
                {
                    if (!ridgeClones.ContainsKey(ridge))
                    {
                        Ridge ridgeClone = new Ridge();
                        ridgeClone.Start = minutiaClones[ridge.Start];
                        ridgeClone.End = minutiaClones[ridge.End];
                        foreach (Point point in ridge.Points)
                            ridgeClone.Points.Add(point);
                        ridgeClones[ridge] = ridgeClone;
                        ridgeClones[ridge.Reversed] = ridgeClone.Reversed;
                    }
                }
            }
            return clone;
        }
コード例 #6
0
        internal static double TranslateAndMatch(List <Minutia> minutiae1, Minutia referenceMinutia1, List <Minutia> minutiae2, Minutia referenceMinutia2, double rotationAngle)
        {
            //from m1 to m2. I DEMAND IT
            var m1 = minutiae1.Select(x => new Minutia()
            {
                Angle = x.Angle, X = x.X - referenceMinutia1.X, Y = x.Y - referenceMinutia1.Y
            }).Reverse();
            var m2 = minutiae2.Select(x => new Minutia()
            {
                Angle = x.Angle, X = x.X - referenceMinutia2.X, Y = x.Y - referenceMinutia2.Y
            }).Reverse().ToList();

            var cos = Math.Cos(rotationAngle);
            var sin = -Math.Sin(rotationAngle);

            foreach (var m in m1)
            {
                var xDash = cos * m.X - sin * m.Y;
                var yDash = sin * m.X + cos * m.Y;

                if (m2.Any(x => (xDash - x.X) * (xDash - x.X) + (yDash - x.Y) * (yDash - x.Y) < MatchingToleranceBox * MatchingToleranceBox))
                {
                    m2.Remove(m2.OrderBy(x => (xDash - x.X) * (xDash - x.X) + (yDash - x.Y) * (yDash - x.Y)).First());
                }
            }
            var total = (minutiae2.Count - m2.Count);

            return(total);
        }
コード例 #7
0
        private int[] GetAlphaCodes(MTriplet mtp)
        {
            int[] alpha = new int[3];
            for (int i = 0; i < 3; i++)
            {
                int j;
                if (i == 2)
                {
                    j = 0;
                }
                else
                {
                    j = i + 1;
                }

                Minutia qMtiai  = mtp[i];
                Minutia qMtiaj  = mtp[j];
                double  x       = qMtiai.X - qMtiaj.X;
                double  y       = qMtiai.Y - qMtiaj.Y;
                double  angleij = Angle.ComputeAngle(x, y);
                double  qAlpha  = Angle.Difference2Pi(qMtiai.Angle, angleij);

                alpha[i] = DiscretizeAngle(qAlpha);
            }
            return(alpha);
        }
コード例 #8
0
        private Int16[] GetNearest(List <Minutia> minutiae, Minutia query)
        {
            double[] distances = new double[neighborsCount];
            Int16[]  nearestM  = new Int16[neighborsCount];
            for (int i = 0; i < distances.Length; i++)
            {
                distances[i] = double.MaxValue;
            }
            MtiaEuclideanDistance dist = new MtiaEuclideanDistance();

            for (Int16 i = 0; i < minutiae.Count; i++)
            {
                if (minutiae[i] != query)
                {
                    double CurrentDistance = dist.Compare(query, minutiae[i]);
                    int    MaxIdx          = 0;
                    for (int j = 1; j < neighborsCount; j++)
                    {
                        if (distances[j] > distances[MaxIdx])
                        {
                            MaxIdx = j;
                        }
                    }
                    if (CurrentDistance < distances[MaxIdx])
                    {
                        distances[MaxIdx] = CurrentDistance;
                        nearestM[MaxIdx]  = i;
                    }
                }
            }
            return(nearestM);
        }
コード例 #9
0
        private bool MatchBetaAngles(MtiaTriplet compareTo)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    if (i != j)
                    {
                        Minutia qMtiai  = minutiae[MtiaIdxs[i]];
                        Minutia qMtiaj  = minutiae[MtiaIdxs[j]];
                        double  x       = qMtiai.X - qMtiaj.X;
                        double  y       = qMtiai.Y - qMtiaj.Y;
                        double  angleij = Angle.ComputeAngle(x, y);
                        double  qBeta   = Angle.DifferencePi(qMtiai.Angle, angleij);

                        Minutia tMtiai = compareTo.minutiae[compareTo.MtiaIdxs[i]];
                        Minutia tMtiaj = compareTo.minutiae[compareTo.MtiaIdxs[j]];
                        x       = tMtiai.X - tMtiaj.X;
                        y       = tMtiai.Y - tMtiaj.Y;
                        angleij = Angle.ComputeAngle(x, y);
                        double tBeta = Angle.DifferencePi(tMtiai.Angle, angleij);

                        double diff = Angle.DifferencePi(qBeta, tBeta);
                        if (diff >= betaThr)
                        {
                            return(false);
                        }
                    }
                }
            }

            return(true);
        }
コード例 #10
0
        private double[] GetOrientations(int radio, Minutia mtia, OrientationImage dirImg)
        {
            double[] currOrientations = new double[radio / 3];
            int      n      = radio / 3;
            double   incAng = 2 * Math.PI * 3.0 / radio;

            for (int i = 0; i < n; i++)
            {
                double myAng = mtia.Angle + i * incAng;
                if (myAng > 2 * Math.PI)
                {
                    myAng -= (double)(2 * Math.PI);
                }
                Point pnt = SetPosToSPoint(myAng, radio, new Point(mtia.X, mtia.Y));
                int   row, col;
                dirImg.GetBlockCoordFromPixel(pnt.X, pnt.Y, out row, out col);
                if ((col < 0) || (row < 0) || (row >= dirImg.Height) ||
                    (col >= dirImg.Width) || (dirImg.IsNullBlock(row, col)))
                {
                    currOrientations[i] = double.NaN;
                }
                else
                {
                    currOrientations[i] =
                        Math.Min(Angle.DifferencePi(mtia.Angle, dirImg.AngleInRadians(row, col)),
                                 Angle.DifferencePi(mtia.Angle, dirImg.AngleInRadians(row, col) + Math.PI));
                }
            }
            return(currOrientations);
        }
コード例 #11
0
        public static List <Minutia> GetMinutias(int[,] data, PixelwiseOrientationField oField)
        {
            int            width    = data.GetLength(1);
            int            height   = data.GetLength(0);
            List <Minutia> minutias = new List <Minutia>();

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    if (IsMinutia(data, x, y))
                    {
                        Minutia m = new Minutia();
                        m.X     = x;
                        m.Y     = y;
                        m.Angle = (float)GetCorrectAngle(
                            data,
                            oField,
                            x,
                            y
                            );
                        minutias.Add(m);
                    }
                }
            }
            return(minutias);
        }
コード例 #12
0
        private bool MatchDistance(Minutia refQuery, Minutia refTemplate, Minutia query, Minutia template)
        {
            double d0 = dist.Compare(refQuery, query);
            double d1 = dist.Compare(refTemplate, template);

            return(Math.Abs(d0 - d1) <= gDistThr);
        }
コード例 #13
0
        private static double DetermineAngle(Minutia begin, Minutia end)
        {
            var dx = end.X - begin.X;
            var dy = begin.Y - end.Y;

            return(Math.Atan2(dy, dx));
        }
コード例 #14
0
ファイル: QiMatcher.cs プロジェクト: fntc/fingerprints
        private static bool MatchDistance(Minutia refQuery, Minutia refTemplate, Minutia query, Minutia template)
        {
            var d0 = MtiaEuclideanDistance.Compare(refQuery, query);
            var d1 = MtiaEuclideanDistance.Compare(refTemplate, template);

            return(Math.Abs(d0 - d1) <= GlobalDistThr);
        }
コード例 #15
0
        private double MatchBetaAngles(MTriplet compareTo, byte[] order)
        {
            var    idxArr  = new[] { 0, 1, 2, 0 };
            double maxdiff = 0;

            for (int i = 0; i < 3; i++)
            {
                int     j      = idxArr[i + 1];
                Minutia qMtiai = minutiae[MtiaIdxs[i]];
                Minutia qMtiaj = minutiae[MtiaIdxs[j]];
                double  qbeta  = Angle.Difference2Pi(qMtiai.Angle, qMtiaj.Angle);

                Minutia tMtiai = compareTo.minutiae[compareTo.MtiaIdxs[order[i]]];
                Minutia tMtiaj = compareTo.minutiae[compareTo.MtiaIdxs[order[j]]];
                double  tbeta  = Angle.Difference2Pi(tMtiai.Angle, tMtiaj.Angle);

                double diff1 = Math.Abs(tbeta - qbeta);
                double diff  = Math.Min(diff1, 2 * Math.PI - diff1);
                if (diff >= aThr)
                {
                    return(0);
                }
                if (diff > maxdiff)
                {
                    maxdiff = diff;
                }
            }

            return(1 - maxdiff / aThr);
        }
コード例 #16
0
ファイル: JYMtiaDescriptor.cs プロジェクト: codeqlcmnd/Qlcmnd
        private double ComputeAlpha(Minutia mtia0, Minutia mtia1)
        {
            double x = mtia0.X - mtia1.X;
            double y = mtia0.Y - mtia1.Y;

            return(Angle.Difference2Pi(mtia0.Angle, Angle.ComputeAngle(x, y)));
        }
コード例 #17
0
        private List <MinutiaPair> GetLocalMatchingMtiae(MtripletsFeature query, MtripletsFeature template, IList <MtripletPair> matchingTriplets)
        {
            var minutiaMatches = new List <MinutiaPair>();
            var qMatches       = new Dictionary <Minutia, Minutia>(60);
            var tMatches       = new Dictionary <Minutia, Minutia>(60);

            foreach (MtripletPair pair in matchingTriplets)
            {
                Minutia qMtia0 = pair.queryMTp[0];
                Minutia qMtia1 = pair.queryMTp[1];
                Minutia qMtia2 = pair.queryMTp[2];
                Minutia tMtia0 = pair.templateMTp[pair.templateMtiaOrder[0]];
                Minutia tMtia1 = pair.templateMTp[pair.templateMtiaOrder[1]];
                Minutia tMtia2 = pair.templateMTp[pair.templateMtiaOrder[2]];

                if (!qMatches.ContainsKey(qMtia0) || !tMatches.ContainsKey(tMtia0))
                {
                    if (!qMatches.ContainsKey(qMtia0))
                    {
                        qMatches.Add(qMtia0, tMtia0);
                    }
                    if (!tMatches.ContainsKey(tMtia0))
                    {
                        tMatches.Add(tMtia0, qMtia0);
                    }
                    minutiaMatches.Add(new MinutiaPair {
                        QueryMtia = qMtia0, TemplateMtia = tMtia0
                    });
                }
                if (!qMatches.ContainsKey(qMtia1) || !tMatches.ContainsKey(tMtia1))
                {
                    if (!qMatches.ContainsKey(qMtia1))
                    {
                        qMatches.Add(qMtia1, tMtia1);
                    }
                    if (!tMatches.ContainsKey(tMtia1))
                    {
                        tMatches.Add(tMtia1, qMtia1);
                    }
                    minutiaMatches.Add(new MinutiaPair {
                        QueryMtia = qMtia1, TemplateMtia = tMtia1
                    });
                }
                if (!qMatches.ContainsKey(qMtia2) || !tMatches.ContainsKey(tMtia2))
                {
                    if (!qMatches.ContainsKey(qMtia2))
                    {
                        qMatches.Add(qMtia2, tMtia2);
                    }
                    if (!tMatches.ContainsKey(tMtia2))
                    {
                        tMatches.Add(tMtia2, qMtia2);
                    }
                    minutiaMatches.Add(new MinutiaPair {
                        QueryMtia = qMtia2, TemplateMtia = tMtia2
                    });
                }
            }
            return(minutiaMatches);
        }
コード例 #18
0
        private static double[] GetOrientations(int radio, Minutia mtia, OrientationImage dirImg)
        {
            var currOrientations = new double[radio / 3];
            var n      = radio / 3;
            var incAng = 2 * Math.PI * 3.0 / radio;

            for (var i = 0; i < n; i++)
            {
                var myAng = mtia.Angle + i * incAng;
                if (myAng > 2 * Math.PI)
                {
                    myAng -= 2 * Math.PI;
                }
                var pnt = SetPosToSPoint(myAng, radio, new Point(mtia.X, mtia.Y));
                dirImg.GetBlockCoordFromPixel(pnt.X, pnt.Y, out var row, out var col);
                if (col < 0 || row < 0 || row >= dirImg.Height ||
                    col >= dirImg.Width || dirImg.IsNullBlock(row, col))
                {
                    currOrientations[i] = double.NaN;
                }
                else
                {
                    currOrientations[i] =
                        Math.Min(Angle.DifferencePi(mtia.Angle, dirImg.AngleInRadians(row, col)),
                                 Angle.DifferencePi(mtia.Angle, dirImg.AngleInRadians(row, col) + Math.PI));
                }
            }
            return(currOrientations);
        }
コード例 #19
0
        public MTriplet(short[] mIdxs, List <Minutia> minutiae)
        {
            Minutiae = minutiae;

            MtiaIdxs = ArrangeClockwise(mIdxs, minutiae);

            var mtiaArr = new Minutia[3];

            mtiaArr[0] = minutiae[MtiaIdxs[0]];
            mtiaArr[1] = minutiae[MtiaIdxs[1]];
            mtiaArr[2] = minutiae[MtiaIdxs[2]];

            // Computing distances and maxBeta angle
            D[0]    = MtiaEuclideanDistance.Compare(mtiaArr[0], mtiaArr[1]);
            D[1]    = MtiaEuclideanDistance.Compare(mtiaArr[1], mtiaArr[2]);
            D[2]    = MtiaEuclideanDistance.Compare(mtiaArr[0], mtiaArr[2]);
            MaxBeta = double.MinValue;
            for (byte i = 0; i < 2; i++)
            {
                for (var j = (byte)(i + 1); j < 3; j++)
                {
                    if (D[SortedDistIdxs[i]] > D[SortedDistIdxs[j]])
                    {
                        var temp = SortedDistIdxs[i];
                        SortedDistIdxs[i] = SortedDistIdxs[j];
                        SortedDistIdxs[j] = temp;
                    }
                    var alpha    = mtiaArr[i].Angle;
                    var beta     = mtiaArr[j].Angle;
                    var diff     = Math.Abs(beta - alpha);
                    var currBeta = Math.Min(diff, 2 * Math.PI - diff);
                    MaxBeta = Math.Max(MaxBeta, Math.Max(currBeta, currBeta));
                }
            }
        }
コード例 #20
0
        private static short[] GetNearest(IReadOnlyList <Minutia> minutiae, Minutia query)
        {
            var distances = new double[NeighborsCount];
            var nearestM  = new short[NeighborsCount];

            for (var i = 0; i < distances.Length; i++)
            {
                distances[i] = Double.MaxValue;
            }

            for (short i = 0; i < minutiae.Count; i++)
            {
                if (minutiae[i] != query)
                {
                    var currentDistance = MtiaEuclideanDistance.Compare(query, minutiae[i]);
                    var maxIdx          = 0;
                    for (var j = 1; j < NeighborsCount; j++)
                    {
                        if (distances[j] > distances[maxIdx])
                        {
                            maxIdx = j;
                        }
                    }
                    if (currentDistance < distances[maxIdx])
                    {
                        distances[maxIdx] = currentDistance;
                        nearestM[maxIdx]  = i;
                    }
                }
            }
            return(nearestM);
        }
コード例 #21
0
        private Cylinder[] CreateCylinders(Minutia minutia)
        {
            Cylinder3D value = new Cylinder3D();
            Cylinder3D mask  = new Cylinder3D();

            for (int i = 1; i <= BaseCuboid; i++)
            {
                for (int j = 1; j <= BaseCuboid; j++)
                {
                    if (IsValidPoint(GetPoint(i, j, minutia), minutia))
                    {
                        for (int k = 1; k <= HeightCuboid; k++)
                        {
                            mask.SetValue(i, j, k, 1);
                            value.SetValue(i, j, k, StepFunction(Sum(
                                                                     GetPoint(i, j, minutia),
                                                                     AngleHeight(k),
                                                                     GetNeighborhood(GetPoint(i, j, minutia), minutia),
                                                                     minutia
                                                                     )
                                                                 ));
                        }
                    }
                }
            }
            return(new[]
            {
                new Cylinder(value.Cylinder, minutia.Angle, Math.Sqrt(CylinderHelper.GetOneBitsCount(value.Cylinder))),
                new Cylinder(mask.Cylinder, minutia.Angle, Math.Sqrt(CylinderHelper.GetOneBitsCount(mask.Cylinder)))
            });
        }
コード例 #22
0
 private void MinutiaOnClick(object sender, RoutedEventArgs e)
 {
     ModifiedImgSingleton.Source = Minutia.MarkMinuties((BitmapSource)ModifiedImgSingleton.Source);
     ModifiedImgSingleton.Source = Minutia.DeleteRepetatiobns((BitmapSource)ModifiedImgSingleton.Source);
     ModifiedImgSingleton.Source = Minutia.RemoveRedundantMinutiaes((BitmapSource)ModifiedImgSingleton.Source);
     ModifiedImgSingleton.Source = Minutia.DeleteFalseMinutiaes((BitmapSource)ModifiedImgSingleton.Source, 20);
     ModifiedImgSingleton.Source = Minutia.MarkEndings((BitmapSource)ModifiedImgSingleton.Source);
 }
コード例 #23
0
        private bool MatchDirections(Minutia query, Minutia template)
        {
            double alpha = query.Angle;
            double beta  = template.Angle;
            double diff  = Math.Abs(beta - alpha);

            return(Math.Min(diff, 2 * Math.PI - diff) <= gaThr);
        }
コード例 #24
0
 private bool EqualsMinutae(Minutia firstMinutia, Minutia secondMinutia)
 {
     return(
         firstMinutia.X == secondMinutia.X &&
         firstMinutia.Y == secondMinutia.Y &&
         Math.Abs(firstMinutia.Angle - secondMinutia.Angle) < float.Epsilon
         );
 }
コード例 #25
0
        private static bool MatchDirections(Minutia query, Minutia template)
        {
            var alpha = query.Angle;
            var beta  = template.Angle;
            var diff  = Math.Abs(beta - alpha);

            return(Math.Min(diff, 2 * Math.PI - diff) <= GaThr);
        }
コード例 #26
0
        private void addMinutia()
        {
            Minutia m = new Minutia {
            };

            Analyzer.FingerprintData.Minutiae.Add(m);
            SelectedMinutia = m;
        }
コード例 #27
0
 internal GOwMtia(Minutia mnt, OrientationImage dImg)
 {
     Minutia  = mnt;
     Segments = new Segment[6];
     for (int i = 0; i < Segments.Length; i++)
     {
         Segments[i] = new Segment(i * (2 * Math.PI / 6) + mnt.Angle, mnt, dImg);
     }
 }
コード例 #28
0
        private static List <MinutiaPair> GetReferenceMtiae(ICollection <MtripletPair> matchingTriplets)
        {
            var pairs    = new List <MinutiaPair>();
            var matches  = new Dictionary <MinutiaPair, byte>(60);
            var qMatches = new Dictionary <MTriplet, byte>(matchingTriplets.Count);
            var tMatches = new Dictionary <MTriplet, byte>(matchingTriplets.Count);

            foreach (var pair in matchingTriplets)
            {
                if (!qMatches.ContainsKey(pair.QueryMTp) || !tMatches.ContainsKey(pair.TemplateMTp))
                {
                    var qMtia0 = pair.QueryMTp[0];
                    var qMtia1 = pair.QueryMTp[1];
                    var qMtia2 = pair.QueryMTp[2];

                    var tMtia0 = pair.TemplateMTp[0];
                    var tMtia1 = pair.TemplateMTp[1];
                    var tMtia2 = pair.TemplateMTp[2];

                    var qRefMtia = new Minutia
                    {
                        X = Convert.ToInt16(Math.Round((qMtia0.X + qMtia1.X + qMtia2.X) / 3.0)),
                        Y = Convert.ToInt16(Math.Round((qMtia0.Y + qMtia1.Y + qMtia2.Y) / 3.0))
                    };
                    var diffY = (Math.Sin(qMtia0.Angle) + Math.Sin(qMtia1.Angle) + Math.Sin(qMtia2.Angle)) / 3.0;
                    var diffX = (Math.Cos(qMtia0.Angle) + Math.Cos(qMtia1.Angle) + Math.Cos(qMtia2.Angle)) / 3.0;
                    qRefMtia.Angle = Angle.ComputeAngle(diffX, diffY);

                    var tRefMtia = new Minutia
                    {
                        X = Convert.ToInt16(Math.Round((tMtia0.X + tMtia1.X + tMtia2.X) / 3.0)),
                        Y = Convert.ToInt16(Math.Round((tMtia0.Y + tMtia1.Y + tMtia2.Y) / 3.0))
                    };
                    diffY          = (Math.Sin(tMtia0.Angle) + Math.Sin(tMtia1.Angle) + Math.Sin(tMtia2.Angle)) / 3.0;
                    diffX          = (Math.Cos(tMtia0.Angle) + Math.Cos(tMtia1.Angle) + Math.Cos(tMtia2.Angle)) / 3.0;
                    tRefMtia.Angle = Angle.ComputeAngle(diffX, diffY);

                    var mPair = new MinutiaPair {
                        QueryMtia = qRefMtia, TemplateMtia = tRefMtia
                    };
                    if (!matches.ContainsKey(mPair))
                    {
                        matches.Add(mPair, 0);
                        pairs.Add(mPair);
                    }
                    if (!qMatches.ContainsKey(pair.QueryMTp))
                    {
                        qMatches.Add(pair.QueryMTp, 0);
                    }
                    if (!tMatches.ContainsKey(pair.TemplateMTp))
                    {
                        tMatches.Add(pair.TemplateMTp, 0);
                    }
                }
            }
            return(pairs);
        }
コード例 #29
0
ファイル: MJY.cs プロジェクト: joshuashercliffe/medNet
 public Minutia Map(Minutia m)
 {
     return(new Minutia
     {
         Angle = m.Angle + dAngle,
         X = Convert.ToInt16(Math.Round((m.X - query.X) * Math.Cos(dAngle) - (m.Y - query.Y) * Math.Sin(dAngle) + template.X)),
         Y = Convert.ToInt16(Math.Round((m.X - query.X) * Math.Sin(dAngle) + (m.Y - query.Y) * Math.Cos(dAngle) + template.Y))
     });
 }
コード例 #30
0
        private static Tuple <int, int> GetCoordinatesInFingerprint(Minutia m, int i, int j)
        {
            double halfNs   = (1 + Constants.Ns) / 2;
            double sinTetta = Math.Sin(m.Angle);
            double cosTetta = Math.Cos(m.Angle);
            double iDelta   = cosTetta * (i - halfNs) + sinTetta * (j - halfNs);
            double jDelta   = -sinTetta * (i - halfNs) + cosTetta * (j - halfNs);

            return(new Tuple <int, int>((int)(m.X + deltaS * iDelta), (int)(m.Y + deltaS * jDelta)));
        }
コード例 #31
0
        private double GaussianDirection(Minutia middleMinutia, Minutia minutia, double anglePoint)
        {
            double common = Math.Sqrt(2) * SigmaDirection;
            double angle  = CylinderHelper.GetAngleDiff(anglePoint,
                                                        CylinderHelper.GetAngleDiff(middleMinutia.Angle, minutia.Angle));
            double first  = Erf(((angle + HeightCell / 2)) / common);
            double second = Erf(((angle - HeightCell / 2)) / common);

            return((first - second) / 2);
        }
コード例 #32
0
ファイル: Template.cs プロジェクト: TristramN/SourceAFIS
        public Template(TemplateBuilder builder)
        {
            OriginalDpi = builder.OriginalDpi;
            OriginalWidth = builder.OriginalWidth;
            OriginalHeight = builder.OriginalHeight;
            StandardDpiWidth = builder.StandardDpiWidth;
            StandardDpiHeight = builder.StandardDpiHeight;

            Minutiae = new Minutia[builder.Minutiae.Count];
            for (int i = 0; i < builder.Minutiae.Count; ++i)
                Minutiae[i] = new Minutia(builder.Minutiae[i]);
        }
コード例 #33
0
    private static Minutia ParseOneString(string str)
    {
      Minutia newMinutia = new Minutia();
      int x;
      int y;
      double angle;
      Int32.TryParse(str.Split()[0], out x);
      Int32.TryParse(str.Split()[1], out y);
      Double.TryParse(str.Split()[0], out angle);

      newMinutia.X = x;
      newMinutia.Y = y;
      newMinutia.Direction = angle;

      return newMinutia;
    }
コード例 #34
0
 public void Detach()
 {
     Start = null;
     End = null;
 }
コード例 #35
0
 public void AddMinutia(Minutia minutia)
 {
     AllMinutiae.Add(minutia);
 }
コード例 #36
0
 public void RemoveMinutia(Minutia minutia)
 {
     AllMinutiae.Remove(minutia);
 }