feat: during Qualibration and Sequence refacto
This commit is contained in:
		
							parent
							
								
									392455e903
								
							
						
					
					
						commit
						a27e340de7
					
				| @ -13,23 +13,18 @@ use std::time::Instant; | ||||
| use crate::draw::{draw_line, draw_line_dotted}; | ||||
| use crate::point::{Color, Point}; | ||||
| 
 | ||||
| use enum_iterator::{next, Sequence as Seq}; | ||||
| use opencv::core::Mat; | ||||
| use opencv::Result; | ||||
| use std::f64::consts::PI; | ||||
| //use std::f64::consts::PI;
 | ||||
| 
 | ||||
| use opencv::core::{bitwise_and, find_file, in_range, Point as OcvPoint, Scalar, Size, Size_}; | ||||
| use opencv::core::{VecN, Vector}; | ||||
| use opencv::imgcodecs::imwrite; | ||||
| use opencv::imgcodecs::{imread, IMREAD_COLOR}; | ||||
| use opencv::imgproc::{canny, cvt_color, line, COLOR_BGR2GRAY}; | ||||
| use opencv::prelude::*; | ||||
| use opencv::{ | ||||
|     highgui, | ||||
|     videoio::{self, VideoCapture}, | ||||
| }; | ||||
| use std::fs::create_dir; | ||||
| use std::fs::read_dir; | ||||
| 
 | ||||
| mod param; | ||||
| use param::Param; | ||||
| 
 | ||||
| mod init_border; | ||||
| mod load_image; | ||||
| @ -40,71 +35,6 @@ use load_image::LoadImage; | ||||
| use save_image::SaveImage; | ||||
| use wait_space::WaitSpace; | ||||
| 
 | ||||
| //impl Clone for dyn Sequence {
 | ||||
| //    fn clone() {
 | ||||
| //    }
 | ||||
| //}
 | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct HoughLine { | ||||
|     pub rho: i32, | ||||
|     pub theta: i32, | ||||
|     pub treshold: i32, | ||||
|     pub min_length: i32, | ||||
|     pub max_line_gap: i32, | ||||
| } | ||||
| 
 | ||||
| // ca c'est les donner qu'on envoie a la fonction
 | ||||
| pub struct HoughLineValue { | ||||
|     pub rho: f64, | ||||
|     pub theta: f64, | ||||
|     pub treshold: i32, | ||||
|     pub min_length: f64, | ||||
|     pub max_line_gap: f64, | ||||
| } | ||||
| 
 | ||||
| impl HoughLine { | ||||
|     pub fn get_param(&self) -> HoughLineValue { | ||||
|         HoughLineValue { | ||||
|             rho: self.rho as f64 / 100., | ||||
|             theta: self.theta as f64 / 100. * PI / 180., | ||||
|             treshold: self.treshold, | ||||
|             min_length: self.min_length as f64 / 100., | ||||
|             max_line_gap: self.max_line_gap as f64 / 100., | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Treshold { | ||||
|     pub win_name: String, | ||||
|     pub min_0: i32, | ||||
|     pub min_1: i32, | ||||
|     pub min_2: i32, | ||||
|     pub max_0: i32, | ||||
|     pub max_1: i32, | ||||
|     pub max_2: i32, | ||||
| } | ||||
| 
 | ||||
| impl Treshold { | ||||
|     pub fn new(name: &str, min: i32, max: i32) -> Result<Self> { | ||||
|         let tresh = Treshold { | ||||
|             win_name: name.to_owned(), | ||||
|             min_0: min, | ||||
|             min_1: min, | ||||
|             min_2: min, | ||||
|             max_0: max, | ||||
|             max_1: max, | ||||
|             max_2: max, | ||||
|         }; | ||||
| 
 | ||||
|         Ok(tresh) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| //impl
 | ||||
| 
 | ||||
| //#[derive(Copy)]
 | ||||
| pub trait Sequence { | ||||
|     fn draw(&self, mem: &Param) -> Option<Vec<Point>>; | ||||
|     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>>; | ||||
| @ -117,96 +47,11 @@ impl std::fmt::Debug for dyn Sequence { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Param { | ||||
|     seq_id: usize, | ||||
|     imgs: Vec<Vec<Mat>>, | ||||
|     dst_size: i32, | ||||
|     r: i32, | ||||
|     g: i32, | ||||
|     b: i32, | ||||
|     nb_all: i32, | ||||
|     nb_visible: i32, | ||||
|     nb_liss: i32, | ||||
|     tresh: Treshold, | ||||
|     canny_v1: i32, | ||||
|     canny_v2: i32, | ||||
|     hough_param: HoughLine, | ||||
|     border_pt: Vec<(f64, f64)>, | ||||
|     homography: Mat, | ||||
|     h_size: Size_<i32>, | ||||
|     line_pos: Vec<i32>, | ||||
|     multiple: u16, // le nombre de fois qu'une photo est prise pour certaine sequence
 | ||||
|     pub key: i32, | ||||
|     dir_name: String, | ||||
|     begin: Instant, | ||||
|     pub capture_mode: bool, | ||||
| } | ||||
| 
 | ||||
| impl Param { | ||||
|     fn save_image(&self) -> Result<()> { | ||||
|         let now = self.begin; | ||||
|         let img_root = format!("image"); | ||||
|         create_dir(&img_root).unwrap_or(()); | ||||
|         let new_dir = format!( | ||||
|             "{img_root}/{:0>6?}_{:0>9?}", | ||||
|             now.elapsed().as_millis(), | ||||
|             now.elapsed().as_nanos() | ||||
|         ); | ||||
|         create_dir(&new_dir).unwrap_or(()); | ||||
|         for (i, img_seq) in self.imgs.iter().enumerate() { | ||||
|             let seq_dir_name = format!("{new_dir}/{i}"); | ||||
|             create_dir(&seq_dir_name).unwrap_or(()); | ||||
|             for img in img_seq { | ||||
|                 let mut name_img = format!("{seq_dir_name}/"); | ||||
|                 name_img.push_str(&format!("img_{i}.png")); | ||||
|                 imwrite(&name_img, img, &Vector::from_slice(&[6, 6, 6, 0]))?; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn load_image(&mut self) -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let mut imgs = vec![]; | ||||
|         let paths = read_dir(&self.dir_name)?; | ||||
|         for entry in paths { | ||||
|             let mut seq_img = vec![]; | ||||
|             let dir = entry?; | ||||
|             let path = dir.path(); // sequence directory
 | ||||
|             let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); | ||||
|             let seq_id: usize = names[names.len() - 1].parse()?; | ||||
|             for entry in read_dir(&path)? { | ||||
|                 let sub_path = entry?.path(); | ||||
|                 let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); | ||||
|                 let img_name = names[names.len() - 1]; | ||||
|                 let img_id: usize = img_name[4..img_name.len() - 4].parse()?; | ||||
|                 let img: Mat = imread( | ||||
|                     &find_file(&sub_path.to_str().unwrap(), false, false)?, | ||||
|                     IMREAD_COLOR, | ||||
|                 )?; | ||||
|                 seq_img.push((img_id, img)); | ||||
|             } | ||||
|             imgs.push((seq_id, seq_img)); | ||||
|         } | ||||
| 
 | ||||
|         self.imgs = vec![vec![]; imgs.len()]; | ||||
|         for (seq_id, seq_img) in imgs { | ||||
|             self.imgs[seq_id] = vec![Mat::default(); seq_img.len()]; | ||||
|             for (img_id, img) in seq_img { | ||||
|                 self.imgs[seq_id][img_id] = img; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct Qualibration { | ||||
|     seq: Vec<Box<dyn Sequence>>, | ||||
|     cam: VideoCapture, | ||||
|     cnt: usize, | ||||
| 
 | ||||
|     pub param: Param, | ||||
| } | ||||
| @ -241,37 +86,7 @@ impl Qualibration { | ||||
|         Ok(Qualibration { | ||||
|             seq, | ||||
|             cam, | ||||
|             cnt: 0, | ||||
|             param: Param { | ||||
|                 begin: std::time::Instant::now(), | ||||
|                 dir_name: dir_name.clone(), | ||||
|                 capture_mode: dir_name.len() == 0, | ||||
|                 key: -1, | ||||
|                 imgs: vec![vec![]], | ||||
|                 seq_id: 0, | ||||
|                 dst_size: 900, | ||||
|                 r: 150, | ||||
|                 g: 0, | ||||
|                 b: 0, | ||||
|                 nb_all: 120, | ||||
|                 nb_visible: 40, | ||||
|                 nb_liss: 10, | ||||
|                 tresh: Treshold::new("histogram", 160, 255)?, | ||||
|                 canny_v1: 170, | ||||
|                 canny_v2: 255, | ||||
|                 hough_param: HoughLine { | ||||
|                     rho: 100, | ||||
|                     theta: 100, | ||||
|                     treshold: 30, | ||||
|                     min_length: 0, | ||||
|                     max_line_gap: 50000, | ||||
|                 }, | ||||
|                 border_pt: vec![], | ||||
|                 homography: Mat::default(), | ||||
|                 h_size: Size::default(), | ||||
|                 line_pos: vec![4095; 34], | ||||
|                 multiple: 20, | ||||
|             }, | ||||
|             param: Param::new(dir_name.to_owned())?, | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
| @ -307,7 +122,6 @@ impl Qualibration { | ||||
|             self.seq[self.param.seq_id].compute_sequence(&mut self.param)?; | ||||
|         } | ||||
| 
 | ||||
|         self.cnt += 1; | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -25,7 +25,7 @@ opencv::not_opencv_branch_4! { | ||||
|     use opencv::core::LINE_AA; | ||||
| } | ||||
| 
 | ||||
| use super::Treshold; | ||||
| use super::param::Treshold; | ||||
| const MAX_TRACKBAR: i32 = 255; | ||||
| 
 | ||||
| pub fn draw_histograme_dbg( | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use super::HoughLine; | ||||
| use super::param::HoughLine; | ||||
| use crate::utils::{CartesianEquation, EqAffine, Pt}; | ||||
| use opencv::core::{add, subtract, Mat, VecN, Vector, CV_8UC3}; | ||||
| //use opencv::prelude::MatTraitConst;
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use super::Treshold; | ||||
| use super::param::Treshold; | ||||
| use opencv::core::{self, bitwise_and, in_range, Mat, Scalar, Size_}; | ||||
| use opencv::imgproc; | ||||
| use opencv::Result; | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| use crate::draw::draw_line; | ||||
| use crate::point::{Color, Point}; | ||||
| use crate::qualib_refacto::{HoughLine, Param, Sequence}; | ||||
| use crate::qualib_refacto::{param::{Param, HoughLine}, Sequence}; | ||||
| 
 | ||||
| use crate::qualib_refacto::annalyse::image_diff; | ||||
| use crate::qualib_refacto::borders::{ | ||||
|  | ||||
							
								
								
									
										181
									
								
								src/qualib_refacto/param.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								src/qualib_refacto/param.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,181 @@ | ||||
| use opencv::{Result, core::{Mat, Size_, Size, Vector, find_file}}; | ||||
| use opencv::imgcodecs::{imread, IMREAD_COLOR, imwrite}; | ||||
| use std::time::Instant; | ||||
| use std::fs::{create_dir, read_dir}; | ||||
| use std::f64::consts::PI; | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Param { | ||||
|     pub seq_id: usize, | ||||
|     pub imgs: Vec<Vec<Mat>>, | ||||
|     pub dst_size: i32, | ||||
|     pub r: i32, | ||||
|     pub g: i32, | ||||
|     pub b: i32, | ||||
|     pub nb_all: i32, | ||||
|     pub nb_visible: i32, | ||||
|     pub nb_liss: i32, | ||||
|     pub tresh: Treshold, | ||||
|     pub canny_v1: i32, | ||||
|     pub canny_v2: i32, | ||||
|     pub hough_param: HoughLine, | ||||
|     pub border_pt: Vec<(f64, f64)>, | ||||
|     pub homography: Mat, | ||||
|     pub h_size: Size_<i32>, | ||||
|     pub line_pos: Vec<i32>, | ||||
|     pub multiple: u16, // le nombre de fois qu'une photo est prise pour certaine sequence
 | ||||
|     pub key: i32, | ||||
|     pub dir_name: String, | ||||
|     pub begin: Instant, | ||||
|     pub capture_mode: bool, | ||||
| } | ||||
| 
 | ||||
| impl Param { | ||||
|     pub fn new(dir_name: String) -> Result<Self> { | ||||
|         Ok(Self { | ||||
|                 begin: std::time::Instant::now(), | ||||
|                 capture_mode: dir_name.len() == 0, | ||||
|                 dir_name, | ||||
|                 key: -1, | ||||
|                 imgs: vec![vec![]], | ||||
|                 seq_id: 0, | ||||
|                 dst_size: 900, | ||||
|                 r: 150, | ||||
|                 g: 0, | ||||
|                 b: 0, | ||||
|                 nb_all: 120, | ||||
|                 nb_visible: 40, | ||||
|                 nb_liss: 10, | ||||
|                 tresh: Treshold::new("histogram", 160, 255)?, | ||||
|                 canny_v1: 170, | ||||
|                 canny_v2: 255, | ||||
|                 hough_param: HoughLine { | ||||
|                     rho: 100, | ||||
|                     theta: 100, | ||||
|                     treshold: 30, | ||||
|                     min_length: 0, | ||||
|                     max_line_gap: 50000, | ||||
|                 }, | ||||
|                 border_pt: vec![], | ||||
|                 homography: Mat::default(), | ||||
|                 h_size: Size::default(), | ||||
|                 line_pos: vec![4095; 34], | ||||
|                 multiple: 20, | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     pub fn save_image(&self) -> Result<()> { | ||||
|         let now = self.begin; | ||||
|         let img_root = format!("image"); | ||||
|         create_dir(&img_root).unwrap_or(()); | ||||
|         let new_dir = format!( | ||||
|             "{img_root}/{:0>6?}_{:0>9?}", | ||||
|             now.elapsed().as_millis(), | ||||
|             now.elapsed().as_nanos() | ||||
|         ); | ||||
|         create_dir(&new_dir).unwrap_or(()); | ||||
|         for (i, img_seq) in self.imgs.iter().enumerate() { | ||||
|             let seq_dir_name = format!("{new_dir}/{i}"); | ||||
|             create_dir(&seq_dir_name).unwrap_or(()); | ||||
|             for img in img_seq { | ||||
|                 let mut name_img = format!("{seq_dir_name}/"); | ||||
|                 name_img.push_str(&format!("img_{i}.png")); | ||||
|                 imwrite(&name_img, img, &Vector::from_slice(&[6, 6, 6, 0]))?; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     pub fn load_image(&mut self) -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let mut imgs = vec![]; | ||||
|         let paths = read_dir(&self.dir_name)?; | ||||
|         for entry in paths { | ||||
|             let mut seq_img = vec![]; | ||||
|             let dir = entry?; | ||||
|             let path = dir.path(); // sequence directory
 | ||||
|             let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); | ||||
|             let seq_id: usize = names[names.len() - 1].parse()?; | ||||
|             for entry in read_dir(&path)? { | ||||
|                 let sub_path = entry?.path(); | ||||
|                 let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); | ||||
|                 let img_name = names[names.len() - 1]; | ||||
|                 let img_id: usize = img_name[4..img_name.len() - 4].parse()?; | ||||
|                 let img: Mat = imread( | ||||
|                     &find_file(&sub_path.to_str().unwrap(), false, false)?, | ||||
|                     IMREAD_COLOR, | ||||
|                 )?; | ||||
|                 seq_img.push((img_id, img)); | ||||
|             } | ||||
|             imgs.push((seq_id, seq_img)); | ||||
|         } | ||||
| 
 | ||||
|         self.imgs = vec![vec![]; imgs.len()]; | ||||
|         for (seq_id, seq_img) in imgs { | ||||
|             self.imgs[seq_id] = vec![Mat::default(); seq_img.len()]; | ||||
|             for (img_id, img) in seq_img { | ||||
|                 self.imgs[seq_id][img_id] = img; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct HoughLine { | ||||
|     pub rho: i32, | ||||
|     pub theta: i32, | ||||
|     pub treshold: i32, | ||||
|     pub min_length: i32, | ||||
|     pub max_line_gap: i32, | ||||
| } | ||||
| 
 | ||||
| // ca c'est les donner qu'on envoie a la fonction
 | ||||
| pub struct HoughLineValue { | ||||
|     pub rho: f64, | ||||
|     pub theta: f64, | ||||
|     pub treshold: i32, | ||||
|     pub min_length: f64, | ||||
|     pub max_line_gap: f64, | ||||
| } | ||||
| 
 | ||||
| impl HoughLine { | ||||
|     pub fn get_param(&self) -> HoughLineValue { | ||||
|         HoughLineValue { | ||||
|             rho: self.rho as f64 / 100., | ||||
|             theta: self.theta as f64 / 100. * PI / 180., | ||||
|             treshold: self.treshold, | ||||
|             min_length: self.min_length as f64 / 100., | ||||
|             max_line_gap: self.max_line_gap as f64 / 100., | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Treshold { | ||||
|     pub win_name: String, | ||||
|     pub min_0: i32, | ||||
|     pub min_1: i32, | ||||
|     pub min_2: i32, | ||||
|     pub max_0: i32, | ||||
|     pub max_1: i32, | ||||
|     pub max_2: i32, | ||||
| } | ||||
| 
 | ||||
| impl Treshold { | ||||
|     pub fn new(name: &str, min: i32, max: i32) -> Result<Self> { | ||||
|         let tresh = Treshold { | ||||
|             win_name: name.to_owned(), | ||||
|             min_0: min, | ||||
|             min_1: min, | ||||
|             min_2: min, | ||||
|             max_0: max, | ||||
|             max_1: max, | ||||
|             max_2: max, | ||||
|         }; | ||||
| 
 | ||||
|         Ok(tresh) | ||||
|     } | ||||
| } | ||||
| @ -12,8 +12,6 @@ impl WaitSpace { | ||||
| } | ||||
| 
 | ||||
| impl Sequence for WaitSpace { | ||||
|     //type Obj = Self;
 | ||||
| 
 | ||||
|     fn draw(&self, mem: &Param) -> Option<Vec<Point>> { | ||||
|         if mem.key == 32 { | ||||
|             return None; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user