private static int[] GetAlphaCodes(MTriplet mtp) { var alpha = new int[3]; for (var i = 0; i < 3; i++) { int j; if (i == 2) { j = 0; } else { j = i + 1; } var qMtiai = mtp[i]; var qMtiaj = mtp[j]; double x = qMtiai.X - qMtiaj.X; double y = qMtiai.Y - qMtiaj.Y; var angleij = Angle.ComputeAngle(x, y); var qAlpha = Angle.Difference2Pi(qMtiai.Angle, angleij); alpha[i] = DiscretizeAngle(qAlpha); } return(alpha); }
internal List <MtripletPair> FindNoRotateAllSimilar(MTriplet queryMTp) { // Indexing by MaxDistance const double dThr = MTriplet.DistanceThreshold; var d = queryMTp.MaxDistance - dThr; var iniIdx = BinarySearch(MTriplets, d); d = queryMTp.MaxDistance + dThr; var result = new List <MtripletPair>(); for (var j = iniIdx; j < MTriplets.Count && MTriplets[j].MaxDistance <= d; j++) { var currMTp = MTriplets[j]; var currSim = queryMTp.NoRotateMatch(currMTp, out var currOrder); if (currSim > 0) { result.Add(new MtripletPair { QueryMTp = queryMTp, TemplateMTp = currMTp, MatchingValue = currSim, TemplateMtiaOrder = currOrder } ); } } return(result.Count > 0 ? result : null); }
public override MtripletsFeature Extract(Bitmap image) { var minutiae = MinutiaeExtractor.ExtractFeatures(image); var result = new List <MTriplet>(); var triplets = new Dictionary <int, int>(); var nearest = new short[minutiae.Count, NeighborsCount]; var distance = new double[minutiae.Count, NeighborsCount]; // Initializing distances for (var i = 0; i < minutiae.Count; i++) { for (var 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 (var j = 0; j < NeighborsCount - 1; j++) { for (var 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"); } var newMTriplet = new MTriplet(new[] { i, nearest[i, j], nearest[i, k] }, minutiae); var newHash = newMTriplet.GetHashCode(); if (!triplets.ContainsKey(newHash)) { triplets.Add(newHash, 0); result.Add(newMTriplet); } } } } } result.TrimExcess(); return(new MtripletsFeature(result, minutiae)); }