open Utils
+// Do not take in account matching score below this when two ellipses are matched.
let matchingScoreThreshold1 = 0.6
-let matchingScoreThreshold2 = 1.
+
+let scaleOverlapTest = 0.8
type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) =
let mutable matchingScore = matchingScore
member this.Ellipse = e
member this.MatchingScore = matchingScore
+
member this.AddMatchingScore(score: float) =
matchingScore <- matchingScore + score
type MatchingEllipses (radiusMin: float) =
let ellipses = List<EllipseScoreFlaggedKd>()
+ // All ellipses with a score below this are removed.
+ let matchingScoreThreshold2 = 25. * radiusMin // 600.
+
member this.Add (e: Ellipse) =
ellipses.Add(EllipseScoreFlaggedKd(0.0, e))
member this.Ellipses : Ellipse list =
List.ofSeq ellipses |> List.map (fun e -> e.Ellipse)
+ // Process all ellipses and return ellipses ordered from the best score to the worst.
member this.PrunedEllipses : Ellipse list =
if ellipses.Count = 0
then
let matchingScore = 2.0 * 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.
+ // 4) Remove ellipses with a low score.
let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.0, 0.0, 0.0, 0.0, 0.0)),
{ new IComparer<EllipseScoreFlaggedKd> with
member this.Compare(e1, e2) = e2.MatchingScore.CompareTo(e1.MatchingScore) }) |> abs
for other in tree.Search window do
if not other.Removed && other.MatchingScore < e.MatchingScore
then
- if e.Ellipse.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