Exemplo n.º 1
0
        private double ComputeScore()
        {
            const int    minSupportingEdges    = 1;
            const double distanceErrorFlatness = 0.69;
            const double angleErrorFlatness    = 0.27;

            const double pairCountFactor        = 0.032;
            const double pairFractionFactor     = 8.98;
            const double correctTypeFactor      = 0.629;
            const double supportedCountFactor   = 0.193;
            const double edgeCountFactor        = 0.265;
            const double distanceAccuracyFactor = 9.9;
            const double angleAccuracyFactor    = 2.79;

            var score = pairCountFactor * PairCount;

            score += pairFractionFactor * (PairCount / (double)Template.Minutiae.Count +
                                           PairCount / (double)Candidate.Minutiae.Count) / 2;

            for (var i = 0; i < PairCount; ++i)
            {
                var pair = PairList[i];
                if (pair.SupportingEdges >= minSupportingEdges)
                {
                    score += supportedCountFactor;
                }
                score += edgeCountFactor * (pair.SupportingEdges + 1);
                if (Template.Minutiae[pair.Pair.Probe].Type == Candidate.Minutiae[pair.Pair.Candidate].Type)
                {
                    score += correctTypeFactor;
                }
            }

            var innerDistanceRadius = Convert.ToInt32(distanceErrorFlatness * MaxDistanceError);
            var innerAngleRadius    = Convert.ToInt32(angleErrorFlatness * MaxAngleError);

            var distanceErrorSum = 0;
            var angleErrorSum    = 0;

            for (var i = 1; i < PairCount; ++i)
            {
                var pair          = PairList[i];
                var probeEdge     = new EdgeShape(Template, pair.Reference.Probe, pair.Pair.Probe);
                var candidateEdge = new EdgeShape(Candidate, pair.Reference.Candidate, pair.Pair.Candidate);
                distanceErrorSum += Math.Abs(probeEdge.Length - candidateEdge.Length);
                angleErrorSum    += Math.Max(innerDistanceRadius,
                                             Angle.Distance(probeEdge.ReferenceAngle, candidateEdge.ReferenceAngle));
                angleErrorSum += Math.Max(innerAngleRadius,
                                          Angle.Distance(probeEdge.NeighborAngle, candidateEdge.NeighborAngle));
            }

            if (PairCount < 2)
            {
                return(score);
            }

            var maxDistanceError = MaxDistanceError * (PairCount - 1);

            score += distanceAccuracyFactor * (maxDistanceError - distanceErrorSum) / maxDistanceError;
            var maxAngleError = MaxAngleError * (PairCount - 1) * 2;

            score += angleAccuracyFactor * (maxAngleError - angleErrorSum) / maxAngleError;

            return(score);
        }
Exemplo n.º 2
0
 private static int HashShape(EdgeShape edge)
 {
     return(((edge.ReferenceAngle / MaxAngleError) << 24) + ((edge.NeighborAngle / MaxAngleError) << 16) +
            edge.Length / MaxDistanceError);
 }