Skip to content

Commit 904bbc8

Browse files
author
sjbeskur
committed
unit test / example to debug opt_flow_pyr_lk results
1 parent c2ff7dc commit 904bbc8

File tree

4 files changed

+173
-0
lines changed

4 files changed

+173
-0
lines changed

tests/data/optflow/1080p_00.png

973 KB
Loading

tests/data/optflow/1080p_01.png

1.04 MB
Loading

tests/notebooks/calc_opt_flow_pyr_lk.ipynb

Lines changed: 92 additions & 0 deletions
Large diffs are not rendered by default.

tests/optflowpyrlk.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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

Comments
 (0)