let matchingScoreThreshold1 = 0.6
-let matchingScoreThreshold2 = 1.0
+let matchingScoreThreshold2 = 1.
type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) =
let mutable matchingScore = matchingScore
member val Processed = false with get, set
member val Removed = false with get, set
- interface KdTree.I2DCoords with
+ interface KdTree.I2DCoords with
member this.X = this.Ellipse.Cx
member this.Y = this.Ellipse.Cy
-
+
type MatchingEllipses (radiusMin: float) =
let ellipses = List<EllipseScoreFlaggedKd>()
-
- member this.Add (e: Ellipse) =
+
+ 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)
+
+ member this.PrunedEllipses : Ellipse list =
if ellipses.Count = 0
then
[]
// 1) Create a kd-tree from the ellipses list.
let tree = KdTree.Tree.BuildTree (List.ofSeq ellipses)
- // 2) Compute the matching score of each ellipses.
+ // 2) Compute the matching score of each ellipses.
let windowSize = radiusMin
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.maxX = e.Ellipse.Cx + windowSize / 2.0
KdTree.minY = e.Ellipse.Cy - windowSize / 2.0
KdTree.maxY = e.Ellipse.Cy + windowSize / 2.0 }
for other in tree.Search window do
// 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 wich have 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
if not e.Removed
then
let window = { KdTree.minX = e.Ellipse.Cx - e.Ellipse.A
- KdTree.maxX = e.Ellipse.Cx + e.Ellipse.A
+ KdTree.maxX = e.Ellipse.Cx + e.Ellipse.A
KdTree.minY = e.Ellipse.Cy - e.Ellipse.A
KdTree.maxY = e.Ellipse.Cy + e.Ellipse.A }
for other in tree.Search window do
if not other.Removed && other.MatchingScore < e.MatchingScore
- then
+ then
if e.Ellipse.Contains other.Ellipse.Cx other.Ellipse.Cy
then
other.Removed <- true
List.ofSeq ellipses |> List.map (fun e -> e.Ellipse)
-
+