1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//! Standalone configuration for gradient-voting ellipse center detection.
//!
//! [`ProposalConfig`] is self-contained and knows nothing about ring markers,
//! calibration boards, or any other ringgrid-specific concepts.
/// Configuration for ellipse center detection via gradient-based radial
/// symmetry voting.
///
/// # Primary parameters
///
/// The three parameters that most strongly affect recall and performance:
///
/// - [`r_min`](Self::r_min) / [`r_max`](Self::r_max) — voting radius range
/// in pixels. Edges cast votes along the gradient direction at distances
/// `[r_min, r_max]` from the edge pixel. The range should bracket the
/// expected radii of the ellipses you are looking for.
/// - [`min_distance`](Self::min_distance) — minimum distance in pixels
/// between output proposals. Controls spatial suppression of nearby peaks.
///
/// # Secondary parameters
///
/// These have sensible defaults and rarely need tuning:
///
/// - [`grad_threshold`](Self::grad_threshold) — fraction of max gradient
/// magnitude; pixels below this are not used for voting.
/// - [`min_vote_frac`](Self::min_vote_frac) — fraction of the accumulator
/// peak; candidate centers below this are discarded.
/// - [`accum_sigma`](Self::accum_sigma) — Gaussian smoothing applied to the
/// vote accumulator before peak extraction.
/// - [`max_candidates`](Self::max_candidates) — optional hard cap on the
/// number of returned proposals.
/// - [`edge_thinning`](Self::edge_thinning) — Canny-style gradient-direction
/// NMS to thin edges before voting (reduces strong-edge count by 60-80%).