Beispiel #1
0
        public void Filter(SkeletonBuilder skeleton)
        {
            PriorityQueueF<Gap> queue = new PriorityQueueF<Gap>();
            foreach (SkeletonBuilder.Minutia end1 in skeleton.Minutiae)
                if (end1.Ridges.Count == 1 && end1.Ridges[0].Points.Count >= MinEndingLength)
                    foreach (SkeletonBuilder.Minutia end2 in skeleton.Minutiae)
                        if (end2 != end1 && end2.Ridges.Count == 1 && end1.Ridges[0].End != end2
                            && end2.Ridges[0].Points.Count >= MinEndingLength && IsWithinLimits(end1, end2))
                        {
                            Gap gap;
                            gap.End1 = end1;
                            gap.End2 = end2;
                            queue.Enqueue(Calc.DistanceSq(end1.Position, end2.Position), gap);
                        }

            BinaryMap shadow = SkeletonShadow.Draw(skeleton);
            while (queue.Count > 0)
            {
                Gap gap = queue.Dequeue();
                if (gap.End1.Ridges.Count == 1 && gap.End2.Ridges.Count == 1)
                {
                    Point[] line = Calc.ConstructLine(gap.End1.Position, gap.End2.Position);
                    if (!IsOverlapping(line, shadow))
                        AddRidge(skeleton, shadow, gap, line);
                }
            }

            KnotRemover.Filter(skeleton);
            Logger.Log(skeleton);
        }
        private void RemoveGaps()
        {
            const int minEndingLength = 7;
            var       queue           = new PriorityQueueF <Gap>();

            foreach (var end1 in Minutiae)
            {
                if (end1.Ridges.Count == 1 && end1.Ridges[0].Points.Count >= minEndingLength)
                {
                    foreach (var end2 in Minutiae)
                    {
                        if (end2 != end1 && end2.Ridges.Count == 1 && end1.Ridges[0].End != end2 &&
                            end2.Ridges[0].Points.Count >= minEndingLength && IsWithinGapLimits(end1, end2))
                        {
                            Gap gap;
                            gap.End1 = end1;
                            gap.End2 = end2;
                            queue.Enqueue((end1.Position - end2.Position).SqLength, gap);
                        }
                    }
                }
            }

            var shadow = GetShadow();

            while (queue.Count > 0)
            {
                var gap = queue.Dequeue();
                if (gap.End1.Ridges.Count == 1 && gap.End2.Ridges.Count == 1)
                {
                    var line = MathEx.ConstructLine(gap.End1.Position, gap.End2.Position);
                    if (!IsRidgeOverlapping(line, shadow))
                    {
                        AddGapRidge(shadow, gap, line);
                    }
                }
            }

            RemoveKnots();
        }
Beispiel #3
0
        public void Filter(SkeletonBuilder skeleton)
        {
            PriorityQueueF <Gap> queue = new PriorityQueueF <Gap>();

            foreach (SkeletonBuilder.Minutia end1 in skeleton.Minutiae)
            {
                if (end1.Ridges.Count == 1 && end1.Ridges[0].Points.Count >= MinEndingLength)
                {
                    foreach (SkeletonBuilder.Minutia end2 in skeleton.Minutiae)
                    {
                        if (end2 != end1 && end2.Ridges.Count == 1 && end1.Ridges[0].End != end2 &&
                            end2.Ridges[0].Points.Count >= MinEndingLength && IsWithinLimits(end1, end2))
                        {
                            Gap gap;
                            gap.End1 = end1;
                            gap.End2 = end2;
                            queue.Enqueue(Calc.DistanceSq(end1.Position, end2.Position), gap);
                        }
                    }
                }
            }

            BinaryMap shadow = SkeletonShadow.Draw(skeleton);

            while (queue.Count > 0)
            {
                Gap gap = queue.Dequeue();
                if (gap.End1.Ridges.Count == 1 && gap.End2.Ridges.Count == 1)
                {
                    Point[] line = Calc.ConstructLine(gap.End1.Position, gap.End2.Position);
                    if (!IsOverlapping(line, shadow))
                    {
                        AddRidge(skeleton, shadow, gap, line);
                    }
                }
            }

            KnotRemover.Filter(skeleton);
            Logger.Log(skeleton);
        }
        void CollectEdges()
        {
            var reference         = LastPair.Pair;
            var probeNeighbors    = Template.EdgeTable[reference.Probe];
            var candidateNeigbors = Candidate.EdgeTable[reference.Candidate];
            var matches           = FindMatchingPairs(probeNeighbors, candidateNeigbors);

            foreach (var match in matches)
            {
                var neighbor = match.Pair;
                if (PairsByCandidate[neighbor.Candidate] == null && PairsByProbe[neighbor.Probe] == null)
                {
                    PairQueue.Enqueue(match.Distance, new EdgePair()
                    {
                        Reference = reference, Neighbor = neighbor
                    });
                }
                else if (PairsByProbe[neighbor.Probe] != null && PairsByProbe[neighbor.Probe].Pair.Candidate == neighbor.Candidate)
                {
                    ++PairsByProbe[reference.Probe].SupportingEdges;
                    ++PairsByProbe[neighbor.Probe].SupportingEdges;
                }
            }
        }
Beispiel #5
0
 public void Enqueue(EdgePair pair, float distance)
 {
     Queue.Enqueue(distance, pair);
 }
        void RemoveGaps()
        {
            const int minEndingLength = 7;
            PriorityQueueF<Gap> queue = new PriorityQueueF<Gap>();
            foreach (SkeletonMinutia end1 in Minutiae)
                if (end1.Ridges.Count == 1 && end1.Ridges[0].Points.Count >= minEndingLength)
                    foreach (SkeletonMinutia end2 in Minutiae)
                        if (end2 != end1 && end2.Ridges.Count == 1 && end1.Ridges[0].End != end2
                            && end2.Ridges[0].Points.Count >= minEndingLength && IsWithinGapLimits(end1, end2))
                        {
                            Gap gap;
                            gap.End1 = end1;
                            gap.End2 = end2;
                            queue.Enqueue((end1.Position - end2.Position).SqLength, gap);
                        }

            var shadow = GetShadow();
            while (queue.Count > 0)
            {
                Gap gap = queue.Dequeue();
                if (gap.End1.Ridges.Count == 1 && gap.End2.Ridges.Count == 1)
                {
                    Point[] line = MathEx.ConstructLine(gap.End1.Position, gap.End2.Position);
                    if (!IsRidgeOverlapping(line, shadow))
                        AddGapRidge(shadow, gap, line);
                }
            }

            RemoveKnots();
        }