@@ -177,7 +177,12 @@ fn generate_candidates(
177
177
} ,
178
178
) ) ;
179
179
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
+ } ) ;
181
186
182
187
PerspectiveGridCandidates { candidates }
183
188
}
@@ -187,6 +192,10 @@ mod tests {
187
192
use approx:: assert_relative_eq;
188
193
use linear_algebra:: { vector, IntoTransform , Isometry3 } ;
189
194
use nalgebra:: { Translation , UnitQuaternion } ;
195
+ use types:: {
196
+ color:: { Intensity , YCbCr444 } ,
197
+ image_segments:: EdgeType ,
198
+ } ;
190
199
191
200
use super :: * ;
192
201
@@ -246,136 +255,183 @@ mod tests {
246
255
} ) ;
247
256
}
248
257
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
+ }
381
437
}
0 commit comments