1
+ #![ cfg( ocvrs_has_module_video) ]
2
+
3
+ use std:: cmp:: Ordering ;
4
+
5
+ use opencv as cv;
6
+ use opencv:: core as cv_core;
7
+ use cv:: { features2d:: * , Result } ;
8
+ use cv_core:: { Size , TermCriteria , VectorToVec , KeyPoint , Mat , Ptr , Vector , Point2f } ;
9
+ use cv:: imgcodecs:: * ;
10
+
11
+ #[ test]
12
+ pub fn check_optical_flow_points ( ) -> Result < ( ) > {
13
+ //let mut detector = ORBFeatureDetector::create();
14
+ let mut detector = AKAZE :: create_def ( ) ?;
15
+
16
+ let prev_img = imread ( "tests/data/optflow/1080p_00.png" , ImreadModes :: IMREAD_GRAYSCALE . into ( ) ) . unwrap ( ) ;
17
+ let cur_img = imread ( "tests/data/optflow/1080p_01.png" , ImreadModes :: IMREAD_GRAYSCALE . into ( ) ) . unwrap ( ) ;
18
+
19
+ let mut prev_kps = Vector :: < KeyPoint > :: new ( ) ;
20
+ let mut prev_desc = Mat :: default ( ) ;
21
+ let mask = Mat :: default ( ) ;
22
+ let _ = detector. detect_and_compute ( & prev_img, & mask, & mut prev_kps, & mut prev_desc, false ) ;
23
+
24
+ let mut ref_pts = Vector :: < Point2f > :: new ( ) ;
25
+ let _ = KeyPoint :: convert_def ( & prev_kps, & mut ref_pts) ; //Converts the KeyPoints to raw Points2f
26
+
27
+ debug_keypoints ( & ref_pts) ;
28
+
29
+ let next_kps = track_pyr_lk ( & prev_img, & cur_img, & ref_pts) ;
30
+
31
+ println ! ( "dumping key_points: " ) ;
32
+ debug_keypoints ( & next_kps) ;
33
+
34
+ let detects = next_kps. len ( ) ;
35
+ println ! ( "detects: {}" , detects) ;
36
+
37
+ // This should fail
38
+ next_kps. to_vec ( ) . iter ( ) . for_each ( |k| assert ! ( k. x. partial_cmp( & 0.0 ) == Some ( Ordering :: Equal ) && k. y. partial_cmp( & 0.0 ) == Some ( Ordering :: Equal ) ) ) ;
39
+
40
+ Ok ( ( ) )
41
+ }
42
+
43
+ fn track_pyr_lk ( prev_img : & Mat , cur_img : & Mat , ref_pts : & Vector < Point2f > ) -> Vector :: < Point2f > {
44
+
45
+ let mut cur_key_points = Vector :: < Point2f > :: new ( ) ;
46
+ let min_eig = 1e-4 ;
47
+ let flags = 0 ; // OPTFLOW_LK_GET_MIN_EIGENVALS vs OPTFLOW_USE_INITIAL_FLOW
48
+ let size = Size :: new ( 21 , 21 ) ;
49
+ let crit = TermCriteria :: default ( ) . unwrap ( ) ; // TermCriteria::new(typ, 30 , 0.01).unwrap();
50
+ let max_levels=3 ;
51
+ let mut err = Vector :: < f64 > :: new ( ) ;
52
+ let mut status = Vector :: < u8 > :: new ( ) ;
53
+
54
+ let _ =cv:: video:: calc_optical_flow_pyr_lk (
55
+ & prev_img,
56
+ & cur_img,
57
+ & ref_pts,
58
+ & mut cur_key_points,
59
+ & mut status,
60
+ & mut err,
61
+ size,
62
+ max_levels,
63
+ crit,
64
+ flags,
65
+ min_eig,
66
+ ) ;
67
+
68
+ cur_key_points
69
+
70
+ }
71
+
72
+ pub fn debug_keypoints ( kps : & Vector < Point2f > ) {
73
+ let points = kps. to_vec ( ) ;
74
+ println ! ( "[debug] keypoints len:{}" , kps. len( ) ) ;
75
+
76
+ if kps. len ( ) < 3 { return ; } ;
77
+
78
+ points[ 0 ..3 ] . iter ( ) . for_each ( |v| println ! ( "{}, {}" , v. x, v. y) ) ;
79
+ println ! ( "....," ) ;
80
+ points[ points. len ( ) -3 ..] . iter ( ) . for_each ( |v| println ! ( "{}, {}" , v. x, v. y) ) ;
81
+ }
0 commit comments