/// <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)); }
/// <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; }