Skip to content

Commit fbf7352

Browse files
committed
fix test cases, sort patches in x for test cases
1 parent cd273b9 commit fbf7352

File tree

1 file changed

+189
-133
lines changed

1 file changed

+189
-133
lines changed

crates/vision/src/perspective_grid_candidates_provider.rs

+189-133
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,12 @@ fn generate_candidates(
177177
},
178178
));
179179

180-
candidates.sort_by(|a, b| b.center.y().total_cmp(&a.center.y()));
180+
candidates.sort_by(|a, b| {
181+
b.center
182+
.y()
183+
.total_cmp(&a.center.y())
184+
.then(b.center.x().total_cmp(&a.center.x()))
185+
});
181186

182187
PerspectiveGridCandidates { candidates }
183188
}
@@ -187,6 +192,10 @@ mod tests {
187192
use approx::assert_relative_eq;
188193
use linear_algebra::{vector, IntoTransform, Isometry3};
189194
use nalgebra::{Translation, UnitQuaternion};
195+
use types::{
196+
color::{Intensity, YCbCr444},
197+
image_segments::EdgeType,
198+
};
190199

191200
use super::*;
192201

@@ -246,136 +255,183 @@ mod tests {
246255
});
247256
}
248257

249-
// TODO: Fix and reenable tests
250-
// #[test]
251-
// fn candidates_correct_single_segment() {
252-
// let rows = vec![
253-
// Row {
254-
// circle_radius: 10.0,
255-
// center_y: 10.0,
256-
// },
257-
// Row {
258-
// circle_radius: 10.0,
259-
// center_y: 30.0,
260-
// },
261-
// Row {
262-
// circle_radius: 10.0,
263-
// center_y: 50.0,
264-
// },
265-
// ];
266-
// let vertical_scan_lines = vec![ScanLine {
267-
// position: 42,
268-
// segments: vec![Segment {
269-
// start: 20,
270-
// end: 50,
271-
// start_edge_type: EdgeType::ImageBorder,
272-
// end_edge_type: EdgeType::ImageBorder,
273-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
274-
// field_color: Intensity::Low,
275-
// }],
276-
// }];
277-
// let skip_segments = HashSet::new();
278-
// let candidates = generate_candidates(&vertical_scan_lines, &skip_segments, &rows);
279-
// assert_relative_eq!(
280-
// candidates,
281-
// PerspectiveGridCandidates {
282-
// candidates: vec![Circle {
283-
// center: point![50.0, 30.0],
284-
// radius: 10.0
285-
// }]
286-
// }
287-
// );
288-
// }
289-
290-
// #[test]
291-
// fn candidates_correct_multi_segment() {
292-
// let rows = vec![
293-
// Row {
294-
// circle_radius: 10.0,
295-
// center_y: 10.0,
296-
// },
297-
// Row {
298-
// circle_radius: 10.0,
299-
// center_y: 30.0,
300-
// },
301-
// Row {
302-
// circle_radius: 10.0,
303-
// center_y: 50.0,
304-
// },
305-
// ];
306-
// let segments = vec![
307-
// Segment {
308-
// start: 5,
309-
// end: 12,
310-
// start_edge_type: EdgeType::ImageBorder,
311-
// end_edge_type: EdgeType::ImageBorder,
312-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
313-
// field_color: Intensity::Low,
314-
// },
315-
// Segment {
316-
// start: 18,
317-
// end: 28,
318-
// start_edge_type: EdgeType::ImageBorder,
319-
// end_edge_type: EdgeType::ImageBorder,
320-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
321-
// field_color: Intensity::Low,
322-
// },
323-
// Segment {
324-
// start: 45,
325-
// end: 50,
326-
// start_edge_type: EdgeType::ImageBorder,
327-
// end_edge_type: EdgeType::ImageBorder,
328-
// color: YCbCr444 { y: 0, cb: 0, cr: 0 },
329-
// field_color: Intensity::Low,
330-
// },
331-
// ];
332-
// let vertical_scan_lines = vec![
333-
// ScanLine {
334-
// position: 0,
335-
// segments: segments.clone(),
336-
// },
337-
// ScanLine {
338-
// position: 42,
339-
// segments: segments.clone(),
340-
// },
341-
// ScanLine {
342-
// position: 110,
343-
// segments,
344-
// },
345-
// ];
346-
// let skip_segments = HashSet::from_iter(
347-
// [
348-
// point![0, 18],
349-
// point![42, 5],
350-
// point![42, 45],
351-
// point![110, 5],
352-
// point![110, 18],
353-
// ]
354-
// .map(|point| point),
355-
// );
356-
// let candidates = generate_candidates(&vertical_scan_lines, &skip_segments, &rows);
357-
// assert_relative_eq!(
358-
// candidates,
359-
// PerspectiveGridCandidates {
360-
// candidates: vec![
361-
// Circle {
362-
// center: point![10.0, 50.0],
363-
// radius: 10.0
364-
// },
365-
// Circle {
366-
// center: point![110.0, 50.0],
367-
// radius: 10.0
368-
// },
369-
// Circle {
370-
// center: point![50.0, 30.0],
371-
// radius: 10.0
372-
// },
373-
// Circle {
374-
// center: point![10.0, 10.0],
375-
// radius: 10.0
376-
// },
377-
// ]
378-
// }
379-
// );
380-
// }
258+
#[test]
259+
fn candidates_correct_single_segment() {
260+
let rows = vec![
261+
Row {
262+
circle_radius: 10.0,
263+
center_y: 10.0,
264+
},
265+
Row {
266+
circle_radius: 10.0,
267+
center_y: 30.0,
268+
},
269+
Row {
270+
circle_radius: 10.0,
271+
center_y: 50.0,
272+
},
273+
];
274+
let vertical_scan_lines = vec![ScanLine {
275+
position: 42,
276+
segments: vec![Segment {
277+
start: 20,
278+
end: 50,
279+
start_edge_type: EdgeType::ImageBorder,
280+
end_edge_type: EdgeType::ImageBorder,
281+
color: YCbCr444 { y: 0, cb: 0, cr: 0 },
282+
field_color: Intensity::Low,
283+
}],
284+
}];
285+
let skip_segments = HashSet::new();
286+
let image = YCbCr422Image::zero(640, 480);
287+
let camera_matrix = CameraMatrix::from_normalized_focal_and_center(
288+
nalgebra::vector![2.0, 2.0],
289+
nalgebra::point![1.0, 1.0],
290+
vector![640.0, 480.0],
291+
Isometry3::identity(),
292+
Isometry3::identity(),
293+
Isometry3::from_translation(0.0, 0.0, 1.0),
294+
);
295+
let minimum_number_of_segments_per_circle = 1;
296+
let ball_radius = 0.05;
297+
298+
let candidates = generate_candidates(
299+
&camera_matrix,
300+
&image,
301+
&vertical_scan_lines,
302+
&skip_segments,
303+
&rows,
304+
minimum_number_of_segments_per_circle,
305+
ball_radius,
306+
);
307+
308+
assert_relative_eq!(
309+
candidates,
310+
PerspectiveGridCandidates {
311+
candidates: vec![
312+
Circle {
313+
center: point![320.0, 240.0],
314+
radius: 43.953747
315+
},
316+
Circle {
317+
center: point![50.0, 30.0],
318+
radius: 10.0
319+
},
320+
]
321+
}
322+
);
323+
}
324+
325+
#[test]
326+
fn candidates_correct_multi_segment() {
327+
let rows = vec![
328+
Row {
329+
circle_radius: 10.0,
330+
center_y: 10.0,
331+
},
332+
Row {
333+
circle_radius: 10.0,
334+
center_y: 30.0,
335+
},
336+
Row {
337+
circle_radius: 10.0,
338+
center_y: 50.0,
339+
},
340+
];
341+
let segments = vec![
342+
Segment {
343+
start: 5,
344+
end: 12,
345+
start_edge_type: EdgeType::ImageBorder,
346+
end_edge_type: EdgeType::ImageBorder,
347+
color: YCbCr444 { y: 0, cb: 0, cr: 0 },
348+
field_color: Intensity::Low,
349+
},
350+
Segment {
351+
start: 18,
352+
end: 28,
353+
start_edge_type: EdgeType::ImageBorder,
354+
end_edge_type: EdgeType::ImageBorder,
355+
color: YCbCr444 { y: 0, cb: 0, cr: 0 },
356+
field_color: Intensity::Low,
357+
},
358+
Segment {
359+
start: 45,
360+
end: 50,
361+
start_edge_type: EdgeType::ImageBorder,
362+
end_edge_type: EdgeType::ImageBorder,
363+
color: YCbCr444 { y: 0, cb: 0, cr: 0 },
364+
field_color: Intensity::Low,
365+
},
366+
];
367+
let vertical_scan_lines = vec![
368+
ScanLine {
369+
position: 0,
370+
segments: segments.clone(),
371+
},
372+
ScanLine {
373+
position: 42,
374+
segments: segments.clone(),
375+
},
376+
ScanLine {
377+
position: 110,
378+
segments,
379+
},
380+
];
381+
let skip_segments = HashSet::from_iter(
382+
[
383+
point![0, 18],
384+
point![42, 5],
385+
point![42, 45],
386+
point![110, 5],
387+
point![110, 18],
388+
]
389+
.map(|point| point),
390+
);
391+
let image = YCbCr422Image::zero(640, 480);
392+
let camera_matrix = CameraMatrix::from_normalized_focal_and_center(
393+
nalgebra::vector![2.0, 2.0],
394+
nalgebra::point![1.0, 1.0],
395+
vector![640.0, 480.0],
396+
Isometry3::identity(),
397+
Isometry3::identity(),
398+
Isometry3::from_translation(0.0, 0.0, 1.0),
399+
);
400+
let minimum_number_of_segments_per_circle = 1;
401+
let ball_radius = 0.05;
402+
403+
let candidates = generate_candidates(
404+
&camera_matrix,
405+
&image,
406+
&vertical_scan_lines,
407+
&skip_segments,
408+
&rows,
409+
minimum_number_of_segments_per_circle,
410+
ball_radius,
411+
);
412+
413+
assert_relative_eq!(
414+
candidates,
415+
PerspectiveGridCandidates {
416+
candidates: vec![
417+
Circle {
418+
center: point![320.0, 240.0],
419+
radius: 43.953747
420+
},
421+
Circle {
422+
center: point![120.0, 50.0],
423+
radius: 10.0
424+
},
425+
Circle {
426+
center: point![10.0, 50.0],
427+
radius: 10.0
428+
},
429+
Circle {
430+
center: point![10.0, 10.0],
431+
radius: 10.0
432+
},
433+
]
434+
}
435+
);
436+
}
381437
}

0 commit comments

Comments
 (0)