// Do not take in account matching score below this when two ellipses are matched.
-let matchingScoreThreshold1 = 0.6
+[<Literal>]
+let matchingScoreThreshold1 = 0.6f
-// All ellipses with a score below this are removed.
-let matchingScoreThreshold2 = 2.
+[<Literal>]
+let scaleOverlapTest = 0.8f
-type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) =
+type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) =
let mutable matchingScore = matchingScore
member this.Ellipse = e
member this.MatchingScore = matchingScore
- member this.AddMatchingScore(score: float) =
+ member this.AddMatchingScore(score: float32) =
matchingScore <- matchingScore + score
member val Processed = false with get, set
member this.Y = this.Ellipse.Cy
-type MatchingEllipses (radiusMin: float) =
+type MatchingEllipses (radiusMin: float32) =
let ellipses = List<EllipseScoreFlaggedKd>()
+ // All ellipses with a score below this are removed.
+ let matchingScoreThreshold2 = 20.f * radiusMin
+
member this.Add (e: Ellipse) =
- ellipses.Add(EllipseScoreFlaggedKd(0.0, e))
+ ellipses.Add(EllipseScoreFlaggedKd(0.f, e))
member this.Ellipses : Ellipse list =
List.ofSeq ellipses |> List.map (fun e -> e.Ellipse)
for e in ellipses do
e.Processed <- true
let areaE = e.Ellipse.Area
- let window = { KdTree.minX = e.Ellipse.Cx - windowSize / 2.0
- KdTree.maxX = e.Ellipse.Cx + windowSize / 2.0
- KdTree.minY = e.Ellipse.Cy - windowSize / 2.0
- KdTree.maxY = e.Ellipse.Cy + windowSize / 2.0 }
+ let window = { KdTree.minX = e.Ellipse.Cx - windowSize / 2.f
+ KdTree.maxX = e.Ellipse.Cx + windowSize / 2.f
+ KdTree.minY = e.Ellipse.Cy - windowSize / 2.f
+ KdTree.maxY = e.Ellipse.Cy + windowSize / 2.f }
for other in tree.Search window do
if not other.Processed
then
let areaOther = other.Ellipse.Area
match EEOver.EEOverlapArea e.Ellipse other.Ellipse with
| Some (commonArea, _, _) ->
- let matchingScore = 2.0 * commonArea / (areaE + areaOther)
+ let matchingScore = 2.f * commonArea / (areaE + areaOther)
if matchingScore >= matchingScoreThreshold1
then
- other.AddMatchingScore(matchingScore)
- e.AddMatchingScore(matchingScore)
+ other.AddMatchingScore(matchingScore * e.Ellipse.Perimeter)
+ e.AddMatchingScore(matchingScore * other.Ellipse.Perimeter)
| _ -> ()
// 3) Sort ellipses by their score.
ellipses.Sort(fun e1 e2 -> e2.MatchingScore.CompareTo(e1.MatchingScore))
- // 4) Remove ellipses wich have a low score.
- let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.0, 0.0, 0.0, 0.0, 0.0)),
+ // 4) Remove ellipses with a low score.
+ let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.f, 0.f, 0.f, 0.f, 0.f)),
{ new IComparer<EllipseScoreFlaggedKd> with
member this.Compare(e1, e2) = e2.MatchingScore.CompareTo(e1.MatchingScore) }) |> abs
let nbToRemove = ellipses.Count - i
for other in tree.Search window do
if not other.Removed && other.MatchingScore < e.MatchingScore
then
- if e.Ellipse.Scale(0.8).Contains other.Ellipse.Cx other.Ellipse.Cy
+ if e.Ellipse.Scale(scaleOverlapTest).Contains other.Ellipse.Cx other.Ellipse.Cy
then
other.Removed <- true
ellipses.RemoveAll(fun e -> e.Removed) |> ignore