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