pupil completed
This commit is contained in:
parent
e19e236c2f
commit
5d13f4606a
|
|
@ -1,11 +1,54 @@
|
||||||
|
use opencv::{core, imgproc, types};
|
||||||
pub struct Point {
|
|
||||||
x: f64,
|
|
||||||
y: f64,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Pupil {
|
pub struct Pupil {
|
||||||
pub iris_frame: String,
|
pub iris_frame: core::Mat,
|
||||||
pub threshold: String,
|
pub threshold: f64,
|
||||||
pub coordinates: Point,
|
pub coordinates: core::Point,
|
||||||
|
}
|
||||||
|
impl Pupil {
|
||||||
|
pub fn new(eye_frame: core::Mat, threshold: f64) -> Self {
|
||||||
|
let iris_frame = image_processing::<opencv::Error>(&eye_frame, threshold).unwrap();
|
||||||
|
let mut contours = types::VectorOfVectorOfPoint::new();
|
||||||
|
|
||||||
|
let _ = imgproc::find_contours(&iris_frame, &mut contours, imgproc::RETR_TREE, imgproc::CHAIN_APPROX_NONE, core::Point::new(0,0));
|
||||||
|
|
||||||
|
let mut contours: Vec<types::VectorOfPoint> = contours.into_iter().collect();
|
||||||
|
|
||||||
|
contours.sort_by(|a, b| {
|
||||||
|
let area_a = imgproc::contour_area(&a, false).unwrap();
|
||||||
|
let area_b = imgproc::contour_area(&b, false).unwrap();
|
||||||
|
area_a.partial_cmp(&area_b).unwrap()
|
||||||
|
});
|
||||||
|
|
||||||
|
let largest_contour = contours.get(contours.len() - 2).unwrap();
|
||||||
|
let moments = imgproc::moments(&largest_contour, false).unwrap();
|
||||||
|
let mut x = 0.0;
|
||||||
|
let mut y = 0.0;
|
||||||
|
|
||||||
|
if moments.m00 != 0.0 {
|
||||||
|
x = moments.m10 / moments.m00;
|
||||||
|
y = moments.m01 / moments.m00;
|
||||||
|
}
|
||||||
|
|
||||||
|
let coordinates = core::Point::new(x as i32, y as i32);
|
||||||
|
|
||||||
|
Self {
|
||||||
|
iris_frame,
|
||||||
|
threshold,
|
||||||
|
coordinates,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn image_processing<E>(eye_frame: &core::Mat, threshold: f64) -> Result<core::Mat, opencv::Error> {
|
||||||
|
let kernel = core::Mat::new_rows_cols_with_default(3,3, core::CV_8U, core::Scalar::all(1.0))?;
|
||||||
|
let mut new_frame = core::Mat::default();
|
||||||
|
|
||||||
|
let _ = imgproc::bilateral_filter(eye_frame, &mut new_frame, 10, 15.0, 15.0, core::BORDER_DEFAULT);
|
||||||
|
|
||||||
|
let _ = imgproc::erode(&new_frame.clone(), &mut new_frame, &kernel, core::Point::new(-1,-1), 3, core::BORDER_CONSTANT, core::Scalar::all(0.0));
|
||||||
|
|
||||||
|
imgproc::threshold(&new_frame.clone(), &mut new_frame, threshold, 255.0, imgproc::THRESH_BINARY)?;
|
||||||
|
|
||||||
|
Ok(new_frame)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue