Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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));
        }