/// <summary>
        ///     Extract features of type <see cref="MtripletsFeature"/> from the specified minutiae.
        /// </summary>
        /// <param name="minutiae">
        ///     The list of <see cref="Minutia"/> to extract the features from.
        /// </param>
        /// <returns>
        ///     Features of type <see cref="MtripletsFeature"/> extracted from the specified minutiae.
        /// </returns>
        public MtripletsFeature ExtractFeatures(List <Minutia> minutiae)
        {
            List <MTriplet>       mtriplets = new List <MTriplet>();
            Dictionary <int, int> triplets  = new Dictionary <int, int>();

            foreach (var triangle in Delaunay2D.Triangulate(minutiae))
            {
                var idxArr = new short[]
                {
                    (short)triangle.A,
                    (short)triangle.B,
                    (short)triangle.C
                };
                MTriplet newMTriplet = new MTriplet(idxArr, minutiae);
                int      newHash     = newMTriplet.GetHashCode();
                if (!triplets.ContainsKey(newHash))
                {
                    triplets.Add(newHash, 0);
                    mtriplets.Add(newMTriplet);
                }
            }

            mtriplets.TrimExcess();
            return(new MtripletsFeature(mtriplets, minutiae));
        }
Exemple #2
0
        /// <summary>
        ///     Extract features of type <see cref="MtripletsFeature"/> from the specified minutiae.
        /// </summary>
        /// <param name="minutiae">
        ///     The list of <see cref="Minutia"/> to extract the features from.
        /// </param>
        /// <returns>
        ///     Features of type <see cref="MtripletsFeature"/> extracted from the specified minutiae.
        /// </returns>
        public MtripletsFeature ExtractFeatures(List <Minutia> minutiae)
        {
            List <MTriplet>       result   = new List <MTriplet>();
            Dictionary <int, int> triplets = new Dictionary <int, int>();

            var nearest  = new short[minutiae.Count, neighborsCount];
            var distance = new double[minutiae.Count, neighborsCount];

            // Initializing distances
            for (int i = 0; i < minutiae.Count; i++)
            {
                for (int j = 0; j < neighborsCount; j++)
                {
                    distance[i, j] = double.MaxValue;
                    nearest[i, j]  = -1;
                }
            }

            // Computing m-triplets
            for (short i = 0; i < minutiae.Count; i++)
            {
                // Updating nearest minutiae
                UpdateNearest(minutiae, i, nearest, distance);

                // Building m-triplets
                for (int j = 0; j < neighborsCount - 1; j++)
                {
                    for (int k = j + 1; k < neighborsCount; k++)
                    {
                        if (nearest[i, j] != -1 && nearest[i, k] != -1)
                        {
                            if (i == nearest[i, j] || i == nearest[i, k] || nearest[i, j] == nearest[i, k])
                            {
                                throw new Exception("Wrong mtp");
                            }

                            MTriplet newMTriplet = new MTriplet(new short[] { i, nearest[i, j], nearest[i, k] }, minutiae);
                            int      newHash     = newMTriplet.GetHashCode();
                            if (!triplets.ContainsKey(newHash))
                            {
                                triplets.Add(newHash, 0);
                                result.Add(newMTriplet);
                            }
                        }
                    }
                }
            }
            result.TrimExcess();
            return(new MtripletsFeature(result, minutiae));
        }
        internal List<MtripletPair> FindSimilarMTriplets(MTriplet queryMTp)
        {
            var result = new List<MtripletPair>();
            for (int j = 0; j < MTriplets.Count; j++)
            {
                MTriplet currMTp = MTriplets[j];
                byte[] currOrder;

                double currSim = queryMTp.Match(currMTp, out currOrder);

                if (currSim > 0)
                    result.Add(new MtripletPair
                    {
                        queryMTp = queryMTp,
                        templateMTp = currMTp,
                        matchingValue = currSim,
                        templateMtiaOrder = currOrder
                    }
                        );
            }
            if (result.Count > 0)
                return result;
            return null;
        }