1
- use std:: collections:: { BTreeMap , HashSet } ;
1
+ use std:: collections:: { HashMap , HashSet } ;
2
2
3
3
use color_eyre:: Result ;
4
4
use serde:: { Deserialize , Serialize } ;
@@ -63,6 +63,7 @@ impl PerspectiveGridCandidatesProvider {
63
63
) ;
64
64
65
65
let candidates = generate_candidates (
66
+ context. camera_matrix ,
66
67
vertical_scanlines,
67
68
skip_segments,
68
69
& perspective_grid_ball_sizes,
@@ -122,12 +123,13 @@ fn find_matching_row(rows: &[Row], segment: &Segment) -> Option<(usize, Row)> {
122
123
}
123
124
124
125
fn generate_candidates (
126
+ camera_matrix : & CameraMatrix ,
125
127
vertical_scanlines : & [ ScanLine ] ,
126
128
skip_segments : & HashSet < Point2 < Pixel , u16 > > ,
127
129
rows : & [ Row ] ,
128
130
minimum_number_of_segments_per_circle : usize ,
129
131
) -> PerspectiveGridCandidates {
130
- let mut segments_per_circles = BTreeMap :: new ( ) ;
132
+ let mut segments_per_circles = HashMap :: new ( ) ;
131
133
132
134
for scan_line in vertical_scanlines {
133
135
for segment in & scan_line. segments {
@@ -149,9 +151,13 @@ fn generate_candidates(
149
151
}
150
152
}
151
153
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) | {
155
161
if segments_per_circle >= minimum_number_of_segments_per_circle {
156
162
let row = rows[ row_index] ;
157
163
Some ( Circle {
@@ -164,8 +170,8 @@ fn generate_candidates(
164
170
} else {
165
171
None
166
172
}
167
- } )
168
- . collect :: < Vec < _ > > ( ) ;
173
+ } ,
174
+ ) ) ;
169
175
170
176
candidates. sort_by ( |a, b| b. center . y ( ) . total_cmp ( & a. center . y ( ) ) ) ;
171
177
@@ -177,10 +183,6 @@ mod tests {
177
183
use approx:: assert_relative_eq;
178
184
use linear_algebra:: { vector, IntoTransform , Isometry3 } ;
179
185
use nalgebra:: { Translation , UnitQuaternion } ;
180
- use types:: {
181
- color:: { Intensity , YCbCr444 } ,
182
- image_segments:: EdgeType ,
183
- } ;
184
186
185
187
use super :: * ;
186
188
@@ -239,137 +241,4 @@ mod tests {
239
241
current
240
242
} ) ;
241
243
}
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
- // }
375
244
}
0 commit comments