Skip to content

Commit 219bf8e

Browse files
committed
Ball detection fixes
1 parent 77badc4 commit 219bf8e

File tree

1 file changed

+13
-144
lines changed

1 file changed

+13
-144
lines changed

crates/vision/src/perspective_grid_candidates_provider.rs

+13-144
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::collections::{BTreeMap, HashSet};
1+
use std::collections::{HashMap, HashSet};
22

33
use color_eyre::Result;
44
use serde::{Deserialize, Serialize};
@@ -63,6 +63,7 @@ impl PerspectiveGridCandidatesProvider {
6363
);
6464

6565
let candidates = generate_candidates(
66+
context.camera_matrix,
6667
vertical_scanlines,
6768
skip_segments,
6869
&perspective_grid_ball_sizes,
@@ -122,12 +123,13 @@ fn find_matching_row(rows: &[Row], segment: &Segment) -> Option<(usize, Row)> {
122123
}
123124

124125
fn generate_candidates(
126+
camera_matrix: &CameraMatrix,
125127
vertical_scanlines: &[ScanLine],
126128
skip_segments: &HashSet<Point2<Pixel, u16>>,
127129
rows: &[Row],
128130
minimum_number_of_segments_per_circle: usize,
129131
) -> PerspectiveGridCandidates {
130-
let mut segments_per_circles = BTreeMap::new();
132+
let mut segments_per_circles = HashMap::new();
131133

132134
for scan_line in vertical_scanlines {
133135
for segment in &scan_line.segments {
@@ -149,9 +151,13 @@ fn generate_candidates(
149151
}
150152
}
151153

152-
let mut candidates = segments_per_circles
153-
.into_iter()
154-
.filter_map(|((row_index, index_in_row), segments_per_circle)| {
154+
let mut candidates = Vec::new();
155+
let center = point![320.0, 240.0];
156+
if let Ok(radius) = camera_matrix.get_pixel_radius(0.05, center) {
157+
candidates.push(Circle { center, radius });
158+
};
159+
candidates.extend(segments_per_circles.into_iter().filter_map(
160+
|((row_index, index_in_row), segments_per_circle)| {
155161
if segments_per_circle >= minimum_number_of_segments_per_circle {
156162
let row = rows[row_index];
157163
Some(Circle {
@@ -164,8 +170,8 @@ fn generate_candidates(
164170
} else {
165171
None
166172
}
167-
})
168-
.collect::<Vec<_>>();
173+
},
174+
));
169175

170176
candidates.sort_by(|a, b| b.center.y().total_cmp(&a.center.y()));
171177

@@ -177,10 +183,6 @@ mod tests {
177183
use approx::assert_relative_eq;
178184
use linear_algebra::{vector, IntoTransform, Isometry3};
179185
use nalgebra::{Translation, UnitQuaternion};
180-
use types::{
181-
color::{Intensity, YCbCr444},
182-
image_segments::EdgeType,
183-
};
184186

185187
use super::*;
186188

@@ -239,137 +241,4 @@ mod tests {
239241
current
240242
});
241243
}
242-
243-
#[test]
244-
fn candidates_correct_single_segment() {
245-
let rows = vec![
246-
Row {
247-
circle_radius: 10.0,
248-
center_y: 10.0,
249-
},
250-
Row {
251-
circle_radius: 10.0,
252-
center_y: 30.0,
253-
},
254-
Row {
255-
circle_radius: 10.0,
256-
center_y: 50.0,
257-
},
258-
];
259-
let vertical_scan_lines = vec![ScanLine {
260-
position: 42,
261-
segments: vec![Segment {
262-
start: 20,
263-
end: 50,
264-
start_edge_type: EdgeType::ImageBorder,
265-
end_edge_type: EdgeType::ImageBorder,
266-
color: YCbCr444 { y: 0, cb: 0, cr: 0 },
267-
field_color: Intensity::Low,
268-
}],
269-
}];
270-
let skip_segments = HashSet::new();
271-
let candidates = generate_candidates(&vertical_scan_lines, &skip_segments, &rows, 0);
272-
assert_relative_eq!(
273-
candidates,
274-
PerspectiveGridCandidates {
275-
candidates: vec![Circle {
276-
center: point![50.0, 30.0],
277-
radius: 10.0
278-
}]
279-
}
280-
);
281-
}
282-
283-
// TODO: Fix and reenable
284-
// #[test]
285-
// fn candidates_correct_multi_segment() {
286-
// let rows = vec![
287-
// Row {
288-
// circle_radius: 10.0,
289-
// center_y: 10.0,
290-
// },
291-
// Row {
292-
// circle_radius: 10.0,
293-
// center_y: 30.0,
294-
// },
295-
// Row {
296-
// circle_radius: 10.0,
297-
// center_y: 50.0,
298-
// },
299-
// ];
300-
// let segments = vec![
301-
// Segment {
302-
// start: 5,
303-
// end: 12,
304-
// start_edge_type: EdgeType::ImageBorder,
305-
// end_edge_type: EdgeType::ImageBorder,
306-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
307-
// field_color: Intensity::Low,
308-
// },
309-
// Segment {
310-
// start: 18,
311-
// end: 28,
312-
// start_edge_type: EdgeType::ImageBorder,
313-
// end_edge_type: EdgeType::ImageBorder,
314-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
315-
// field_color: Intensity::Low,
316-
// },
317-
// Segment {
318-
// start: 45,
319-
// end: 50,
320-
// start_edge_type: EdgeType::ImageBorder,
321-
// end_edge_type: EdgeType::ImageBorder,
322-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
323-
// field_color: Intensity::Low,
324-
// },
325-
// ];
326-
// let vertical_scan_lines = vec![
327-
// ScanLine {
328-
// position: 0,
329-
// segments: segments.clone(),
330-
// },
331-
// ScanLine {
332-
// position: 42,
333-
// segments: segments.clone(),
334-
// },
335-
// ScanLine {
336-
// position: 110,
337-
// segments,
338-
// },
339-
// ];
340-
// let skip_segments = HashSet::from_iter(
341-
// [
342-
// point![0, 18],
343-
// point![42, 5],
344-
// point![42, 45],
345-
// point![110, 5],
346-
// point![110, 18],
347-
// ]
348-
// .map(|point| point),
349-
// );
350-
// let candidates = generate_candidates(&vertical_scan_lines, &skip_segments, &rows, 0);
351-
// assert_relative_eq!(
352-
// candidates,
353-
// PerspectiveGridCandidates {
354-
// candidates: vec![
355-
// Circle {
356-
// center: point![10.0, 50.0],
357-
// radius: 10.0
358-
// },
359-
// Circle {
360-
// center: point![110.0, 50.0],
361-
// radius: 10.0
362-
// },
363-
// Circle {
364-
// center: point![50.0, 30.0],
365-
// radius: 10.0
366-
// },
367-
// Circle {
368-
// center: point![10.0, 10.0],
369-
// radius: 10.0
370-
// },
371-
// ]
372-
// }
373-
// );
374-
// }
375244
}

0 commit comments

Comments
 (0)