fix: save and load
This commit is contained in:
		
							parent
							
								
									7460b74c15
								
							
						
					
					
						commit
						fef7e1387b
					
				
							
								
								
									
										76
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -87,46 +87,36 @@ fn run_all() -> Result<(), Box<dyn std::error::Error>> { | |||||||
|     )?; |     )?; | ||||||
| 
 | 
 | ||||||
|     while running.load(Ordering::SeqCst) { |     while running.load(Ordering::SeqCst) { | ||||||
|         //let _t = _framerate_handler.handle_time()?;
 |         let key = highgui::wait_key(20)?; | ||||||
|         /////////////////
 |         let v = qualibration.draw_sequence(); | ||||||
|         let key = highgui::wait_key(1)?; | 
 | ||||||
|  |         if key != -1 { | ||||||
|  |             println!("key: {key}"); | ||||||
|  |             // 81 <-  -> 83 
 | ||||||
|  |         } | ||||||
|         qualibration.param.key = key; |         qualibration.param.key = key; | ||||||
|         if key == 27 { |         if key == 27 { | ||||||
|             break; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         let v = qualibration.draw_sequence(); |  | ||||||
|         if v.is_some() { |  | ||||||
|             if qualibration.param.capture_mode { |             if qualibration.param.capture_mode { | ||||||
|                 let pl: Vec<(f32, f32, u32)> = v |                 qualibration.param.save_image()?; | ||||||
|                     .unwrap() |  | ||||||
|                     .iter() |  | ||||||
|                     .map(|pt| (pt.x, pt.y, u32::from(pt.color))) |  | ||||||
|                     .collect(); |  | ||||||
| 
 |  | ||||||
|                 let _ = con.set( |  | ||||||
|                     format!("/pl/{}/{}", config.client_id, config.laser_id), |  | ||||||
|                     format!("{:?}", pl), |  | ||||||
|                 )?; |  | ||||||
|             } |             } | ||||||
| 
 |             break; | ||||||
|             qualibration.run_step()?; |         } else if v.is_none() { | ||||||
|  |             continue; | ||||||
|         } |         } | ||||||
|         //qualibration.id = next_id;
 |  | ||||||
| 
 | 
 | ||||||
|         //let q_id = qualibration.id.clone();
 |         if qualibration.param.capture_mode { | ||||||
|         //let mut n = 65534;
 |             let pl: Vec<(f32, f32, u32)> = v | ||||||
|         //if let Sequence::TakeMultiple(m) = q_id.clone().unwrap_or(Sequence::Finish) {
 |                 .unwrap() | ||||||
|         //    n = m;
 |                 .iter() | ||||||
|         //};
 |                 .map(|pt| (pt.x, pt.y, u32::from(pt.color))) | ||||||
|         //if qualibration.capture_mode
 |                 .collect(); | ||||||
|         //    && (q_id != Some(Sequence::WaitSpace)
 |             con.set( | ||||||
|         //        || q_id != Some(Sequence::PlayLineDotted)
 |                 format!("/pl/{}/{}", config.client_id, config.laser_id), | ||||||
|         //        || n != 65534)
 |                 format!("{:?}", pl), | ||||||
|         //{
 |             )?; | ||||||
|         //    let millis = std::time::Duration::from_millis(400); // TODO: find solution to know when change has been done
 |         } | ||||||
|         //    std::thread::sleep(millis);
 | 
 | ||||||
|         //}
 |         qualibration.run_step()?; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let _ = con.set( |     let _ = con.set( | ||||||
| @ -135,3 +125,21 @@ fn run_all() -> Result<(), Box<dyn std::error::Error>> { | |||||||
|     )?; |     )?; | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | //let _t = _framerate_handler.handle_time()?;
 | ||||||
|  | /////////////////
 | ||||||
|  | //qualibration.id = next_id;
 | ||||||
|  | 
 | ||||||
|  | //let q_id = qualibration.id.clone();
 | ||||||
|  | //let mut n = 65534;
 | ||||||
|  | //if let Sequence::TakeMultiple(m) = q_id.clone().unwrap_or(Sequence::Finish) {
 | ||||||
|  | //    n = m;
 | ||||||
|  | //};
 | ||||||
|  | //if qualibration.capture_mode
 | ||||||
|  | //    && (q_id != Some(Sequence::WaitSpace)
 | ||||||
|  | //        || q_id != Some(Sequence::PlayLineDotted)
 | ||||||
|  | //        || n != 65534)
 | ||||||
|  | //{
 | ||||||
|  | //    let millis = std::time::Duration::from_millis(400); // TODO: find solution to know when change has been done
 | ||||||
|  | //    std::thread::sleep(millis);
 | ||||||
|  | //}
 | ||||||
|  | |||||||
| @ -37,7 +37,7 @@ pub struct Qualibration { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Qualibration { | impl Qualibration { | ||||||
|     pub fn new() -> Result<Self> { |     pub fn new() -> Result<Self, Box<dyn std::error::Error>> { | ||||||
|         //let v: Vec<Box<dyn Sequence>> = vec![];
 |         //let v: Vec<Box<dyn Sequence>> = vec![];
 | ||||||
| 
 | 
 | ||||||
|         let mut dir_name = "".to_string(); //"building.jpg".to_string(); // by default
 |         let mut dir_name = "".to_string(); //"building.jpg".to_string(); // by default
 | ||||||
| @ -54,23 +54,25 @@ impl Qualibration { | |||||||
|         let mut frame = Mat::default(); |         let mut frame = Mat::default(); | ||||||
|         cam.read(&mut frame)?; |         cam.read(&mut frame)?; | ||||||
| 
 | 
 | ||||||
|         // 38400 -> r:150, v:0, b:0
 |         // 9830400 -> r:150, v:0, b:0
 | ||||||
|         let beg = Point::from((0., 0., 38400)); |         let beg = Point::from((0., 0., 9830400)); | ||||||
|         let beg2 = Point::from((4095., 0., 38400)); |         let beg2 = Point::from((0., 4095., 9830400)); | ||||||
|         let end = Point::from((4095., 4095., 38400)); |         let end = Point::from((4095., 4095., 9830400)); | ||||||
|         let seq: Vec<Box<dyn Sequence>> = vec![ |         let seq: Vec<Box<dyn Sequence>> = vec![ | ||||||
|             Box::new(LoadImage::new()), |             Box::new(WaitSpace::new(beg, end, 400)), | ||||||
|             Box::new(WaitSpace::new(beg, end)), |             Box::new(InitBorder::new(beg, end, 400)), | ||||||
|             Box::new(InitBorder::new(beg, end)), |             Box::new(LineDotted::new(beg, end, 2, true, false, 400)), | ||||||
|             Box::new(LineDotted::new(beg, end, true, false)), |             Box::new(InitIdcode::new(beg2, end, 400)), | ||||||
|             Box::new(InitIdcode::new(beg2, end)), |  | ||||||
|             Box::new(SaveImage::new()), |  | ||||||
|         ]; |         ]; | ||||||
|         //let now = std::time::Instant::now();
 |         let seq_names = get_sequence_name(&seq); | ||||||
|  |         let mut param = Param::new(dir_name.to_owned(), seq_names)?; | ||||||
|  |         if !param.capture_mode { | ||||||
|  |             param.load_image()?; | ||||||
|  |         } | ||||||
|         Ok(Qualibration { |         Ok(Qualibration { | ||||||
|             seq, |             seq, | ||||||
|             cam, |             cam, | ||||||
|             param: Param::new(dir_name.to_owned())?, |             param, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -92,7 +94,18 @@ impl Qualibration { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn run_step(self: &mut Self) -> Result<(), Box<dyn std::error::Error>> { |     pub fn run_step(self: &mut Self) -> Result<(), Box<dyn std::error::Error>> { | ||||||
|  |         let seq_id = self.param.seq_id; | ||||||
|  |         let seq_name = self.seq[seq_id].sequence_name(); | ||||||
|  |         println!("seq[{seq_id}]: {seq_name}"); | ||||||
|  | 
 | ||||||
|  |         if self.param.capture_mode { | ||||||
|  |             let millis_nb = self.seq[self.param.seq_id].wait_milis(); | ||||||
|  |             let millis = std::time::Duration::from_millis(millis_nb); // TODO: find solution to know when change has been done
 | ||||||
|  |             std::thread::sleep(millis); | ||||||
|  |         } | ||||||
|  |  
 | ||||||
|         let mut frame = Mat::default(); |         let mut frame = Mat::default(); | ||||||
|  |         //println!("sequence: {}:{:?}", self.param.seq_id, &self.seq[self.param.seq_id]);
 | ||||||
|         if self.param.capture_mode { |         if self.param.capture_mode { | ||||||
|             self.cam.read(&mut frame)?; |             self.cam.read(&mut frame)?; | ||||||
|             highgui::imshow("camera", &frame)?; |             highgui::imshow("camera", &frame)?; | ||||||
| @ -108,4 +121,16 @@ impl Qualibration { | |||||||
| 
 | 
 | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | pub fn get_sequence_name(seq: &Vec<Box<dyn Sequence>>) -> Vec<String> { | ||||||
|  |     let mut v = vec![]; | ||||||
|  | 
 | ||||||
|  |     for i in 0..seq.len() { | ||||||
|  |         v.push(seq[i].sequence_name()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     v | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -819,6 +819,7 @@ pub fn trackbar_init_param(mem: &mut Param, winname: &str) -> Result<()> { | |||||||
| 
 | 
 | ||||||
|     create_trackbar("nb_all", winname, Some(&mut mem.nb_all), 400, None)?; |     create_trackbar("nb_all", winname, Some(&mut mem.nb_all), 400, None)?; | ||||||
|     create_trackbar("nb_visible", winname, Some(&mut mem.nb_visible), 400, None)?; |     create_trackbar("nb_visible", winname, Some(&mut mem.nb_visible), 400, None)?; | ||||||
|  |     create_trackbar("nb_wait", winname, Some(&mut mem.nb_wait), 40, None)?; | ||||||
|     create_trackbar("r", winname, Some(&mut mem.r), MAX_TRACKBAR, None)?; |     create_trackbar("r", winname, Some(&mut mem.r), MAX_TRACKBAR, None)?; | ||||||
|     create_trackbar("g", winname, Some(&mut mem.g), MAX_TRACKBAR, None)?; |     create_trackbar("g", winname, Some(&mut mem.g), MAX_TRACKBAR, None)?; | ||||||
|     create_trackbar("b", winname, Some(&mut mem.b), MAX_TRACKBAR, None)?; |     create_trackbar("b", winname, Some(&mut mem.b), MAX_TRACKBAR, None)?; | ||||||
| @ -914,7 +915,7 @@ pub fn line_pos(mem: &mut Param, winname: &str) -> Result<()> { | |||||||
| pub fn adding_trackbar(mem: &mut Param, _winname: &str) -> Result<()> { | pub fn adding_trackbar(mem: &mut Param, _winname: &str) -> Result<()> { | ||||||
|     //println!("winname: {winname}");
 |     //println!("winname: {winname}");
 | ||||||
|     //line_pos(&mut mem, "Play Line")?;
 |     //line_pos(&mut mem, "Play Line")?;
 | ||||||
|     //trackbar_init_param(mem, "init_param")?;
 |     trackbar_init_param(mem, "init_param")?; | ||||||
| 
 | 
 | ||||||
|     named_window("histo bgr", WINDOW_AUTOSIZE)?; |     named_window("histo bgr", WINDOW_AUTOSIZE)?; | ||||||
|     associate_trackbar("histo bgr", &mut mem.tresh)?; |     associate_trackbar("histo bgr", &mut mem.tresh)?; | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ use std::time::Instant; | |||||||
| #[derive(Clone, Debug)] | #[derive(Clone, Debug)] | ||||||
| pub struct Param { | pub struct Param { | ||||||
|     pub seq_id: usize, |     pub seq_id: usize, | ||||||
|  |     pub seq_names: Vec<String>, | ||||||
|     pub imgs: Vec<Vec<Mat>>, |     pub imgs: Vec<Vec<Mat>>, | ||||||
|     pub dst_size: i32, |     pub dst_size: i32, | ||||||
|     pub r: i32, |     pub r: i32, | ||||||
| @ -35,7 +36,7 @@ pub struct Param { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Param { | impl Param { | ||||||
|     pub fn new(dir_name: String) -> Result<Self> { |     pub fn new(dir_name: String, seq_names: Vec<String>) -> Result<Self> { | ||||||
|         Ok(Self { |         Ok(Self { | ||||||
|             begin: std::time::Instant::now(), |             begin: std::time::Instant::now(), | ||||||
|             capture_mode: dir_name.len() == 0, |             capture_mode: dir_name.len() == 0, | ||||||
| @ -43,6 +44,7 @@ impl Param { | |||||||
|             key: -1, |             key: -1, | ||||||
|             imgs: vec![vec![]], |             imgs: vec![vec![]], | ||||||
|             seq_id: 0, |             seq_id: 0, | ||||||
|  |             seq_names, | ||||||
|             dst_size: 900, |             dst_size: 900, | ||||||
|             r: 150, |             r: 150, | ||||||
|             g: 0, |             g: 0, | ||||||
| @ -50,7 +52,7 @@ impl Param { | |||||||
|             nb_all: 120, |             nb_all: 120, | ||||||
|             nb_visible: 40, |             nb_visible: 40, | ||||||
|             nb_liss: 10, |             nb_liss: 10, | ||||||
|             nb_wait: 30, |             nb_wait: 3, | ||||||
|             tresh: Treshold::new("histogram", 160, 255)?, |             tresh: Treshold::new("histogram", 160, 255)?, | ||||||
|             canny_v1: 170, |             canny_v1: 170, | ||||||
|             canny_v2: 255, |             canny_v2: 255, | ||||||
| @ -80,11 +82,11 @@ impl Param { | |||||||
|         ); |         ); | ||||||
|         create_dir(&new_dir).unwrap_or(()); |         create_dir(&new_dir).unwrap_or(()); | ||||||
|         for (i, img_seq) in self.imgs.iter().enumerate() { |         for (i, img_seq) in self.imgs.iter().enumerate() { | ||||||
|             let seq_dir_name = format!("{new_dir}/{i}"); |             let seq_dir_name = format!("{new_dir}/seq_{i}_{}", self.seq_names[i]); | ||||||
|             create_dir(&seq_dir_name).unwrap_or(()); |             create_dir(&seq_dir_name).unwrap_or(()); | ||||||
|             for img in img_seq { |             for (id, img) in img_seq.iter().enumerate() { | ||||||
|                 let mut name_img = format!("{seq_dir_name}/"); |                 let mut name_img = format!("{seq_dir_name}/"); | ||||||
|                 name_img.push_str(&format!("img_{i}.png")); |                 name_img.push_str(&format!("img_{id}.png")); | ||||||
|                 imwrite(&name_img, img, &Vector::from_slice(&[6, 6, 6, 0]))?; |                 imwrite(&name_img, img, &Vector::from_slice(&[6, 6, 6, 0]))?; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -100,11 +102,16 @@ impl Param { | |||||||
|             let dir = entry?; |             let dir = entry?; | ||||||
|             let path = dir.path(); // sequence directory
 |             let path = dir.path(); // sequence directory
 | ||||||
|             let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); |             let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); | ||||||
|             let seq_id: usize = names[names.len() - 1].parse()?; |             let parts: Vec<&str> = names[names.len() - 1].split("_").collect(); | ||||||
|  |             let nbr = parts[1]; | ||||||
|  |             //println!("\t\t=> '{}'",  names[names.len() - 1]);
 | ||||||
|  |             let seq_id: usize = parts[1].parse()?; | ||||||
|             for entry in read_dir(&path)? { |             for entry in read_dir(&path)? { | ||||||
|                 let sub_path = entry?.path(); |                 let sub_path = entry?.path(); | ||||||
|                 let names: Vec<&str> = path.to_str().unwrap().split("/").collect(); |                 let names: Vec<&str> = sub_path.to_str().unwrap().split("/").collect(); | ||||||
|                 let img_name = names[names.len() - 1]; |                 let img_name = names[names.len() - 1]; | ||||||
|  |                 //println!("all_names: {:?}", &names);
 | ||||||
|  |                 //println!("img_name: {}", img_name);
 | ||||||
|                 let img_id: usize = img_name[4..img_name.len() - 4].parse()?; |                 let img_id: usize = img_name[4..img_name.len() - 4].parse()?; | ||||||
|                 let img: Mat = imread( |                 let img: Mat = imread( | ||||||
|                     &find_file(&sub_path.to_str().unwrap(), false, false)?, |                     &find_file(&sub_path.to_str().unwrap(), false, false)?, | ||||||
|  | |||||||
| @ -18,6 +18,8 @@ pub trait Sequence { | |||||||
|     fn draw(&self, mem: &Param) -> Option<Vec<Point>>; |     fn draw(&self, mem: &Param) -> Option<Vec<Point>>; | ||||||
|     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>>; |     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>>; | ||||||
|     fn is_capture(&self) -> bool; |     fn is_capture(&self) -> bool; | ||||||
|  |     fn sequence_name(&self) -> String; | ||||||
|  |     fn wait_milis(&self) -> u64; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl std::fmt::Debug for dyn Sequence { | impl std::fmt::Debug for dyn Sequence { | ||||||
|  | |||||||
| @ -7,14 +7,15 @@ use crate::qualibration::{ | |||||||
| 
 | 
 | ||||||
| use crate::qualibration::annalyse::image_diff; | use crate::qualibration::annalyse::image_diff; | ||||||
| use crate::qualibration::borders::{ | use crate::qualibration::borders::{ | ||||||
|     bord_mult, get_extermities, get_intersection, probabilistic_hough, |     bord_mult, get_extermities, get_intersection, probabilistic_hough, mix_borders, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use opencv::{ | use opencv::{ | ||||||
|     calib3d, |     calib3d, | ||||||
|     core::{Mat, Point as OcvPoint, Size, VecN, Vector}, |     core::{Mat, Point as OcvPoint, Size, VecN, Vector, Scalar, BORDER_CONSTANT}, | ||||||
|     imgproc::{canny, cvt_color, COLOR_BGR2GRAY}, |     imgproc::{self, canny, cvt_color, COLOR_BGR2GRAY, line}, | ||||||
|     Result, |     Result, | ||||||
|  |     highgui, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| opencv::opencv_branch_4! { | opencv::opencv_branch_4! { | ||||||
| @ -30,10 +31,11 @@ pub struct InitBorder { | |||||||
|     finished: bool, |     finished: bool, | ||||||
|     cnt: usize, |     cnt: usize, | ||||||
|     borders: [Point; 4], |     borders: [Point; 4], | ||||||
|  |     nb_millis: u64, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl InitBorder { | impl InitBorder { | ||||||
|     pub fn new(beg: Point, end: Point) -> Self { |     pub fn new(beg: Point, end: Point, nb_millis: u64) -> Self { | ||||||
|         InitBorder { |         InitBorder { | ||||||
|             borders: [ |             borders: [ | ||||||
|                 Point { |                 Point { | ||||||
| @ -57,6 +59,7 @@ impl InitBorder { | |||||||
|                     color: end.color, |                     color: end.color, | ||||||
|                 }, |                 }, | ||||||
|             ], |             ], | ||||||
|  |             nb_millis, | ||||||
|             cnt: 0, |             cnt: 0, | ||||||
|             finished: false, |             finished: false, | ||||||
|         } |         } | ||||||
| @ -67,7 +70,7 @@ impl Sequence for InitBorder { | |||||||
|     //type Obj = Self;
 |     //type Obj = Self;
 | ||||||
| 
 | 
 | ||||||
|     fn draw(&self, mem: &Param) -> Option<Vec<Point>> { |     fn draw(&self, mem: &Param) -> Option<Vec<Point>> { | ||||||
|         if self.cnt > self.borders.len() { |         if self.cnt > self.borders.len() || self.finished { | ||||||
|             return None; |             return None; | ||||||
|         } |         } | ||||||
|         if self.cnt == self.borders.len() { |         if self.cnt == self.borders.len() { | ||||||
| @ -126,19 +129,19 @@ impl Sequence for InitBorder { | |||||||
|         let border_pt = get_intersection(&bords_pts); |         let border_pt = get_intersection(&bords_pts); | ||||||
|         mem.border_pt = bord_mult(border_pt, 1.1); |         mem.border_pt = bord_mult(border_pt, 1.1); | ||||||
| 
 | 
 | ||||||
|         //// on dessine le cadre
 |         // on dessine le cadre
 | ||||||
|         //let color: VecN<f64, 4> = VecN::new(255., 128., 0., 255.);
 |         let color: VecN<f64, 4> = VecN::new(255., 128., 0., 255.); | ||||||
|         //let mut mixed = mix_borders(&background, borders)?;
 |         let mut mixed = mix_borders(&background, borders)?; | ||||||
|         //let b = &mem.border_pt;
 |         let b = &mem.border_pt; | ||||||
|         //for i in 0..b.len() {
 |         for i in 0..b.len() { | ||||||
|         //    let j = (i + 1) % mem.border_pt.len();
 |             let j = (i + 1) % mem.border_pt.len(); | ||||||
|         //    let pa = VecN::from_array([b[i].0 as i32, b[i].1 as i32]);
 |             let pa = VecN::from_array([b[i].0 as i32, b[i].1 as i32]); | ||||||
|         //    let pb = VecN::from_array([b[j].0 as i32, b[j].1 as i32]);
 |             let pb = VecN::from_array([b[j].0 as i32, b[j].1 as i32]); | ||||||
|         //    let a = OcvPoint::from_vec2(pa);
 |             let a = OcvPoint::from_vec2(pa); | ||||||
|         //    let b = OcvPoint::from_vec2(pb);
 |             let b = OcvPoint::from_vec2(pb); | ||||||
|         //    line(&mut mixed, a, b, color, 1, LINE_AA, 0)?;
 |             line(&mut mixed, a, b, color, 1, LINE_AA, 0)?; | ||||||
|         //}
 |         } | ||||||
|         //highgui::imshow("mixed bored", &mixed)?;
 |         highgui::imshow("mixed bored", &mixed)?; | ||||||
| 
 | 
 | ||||||
|         // on calcule l'homography
 |         // on calcule l'homography
 | ||||||
|         let size = mem.dst_size; |         let size = mem.dst_size; | ||||||
| @ -150,7 +153,7 @@ impl Sequence for InitBorder { | |||||||
|             .map(|(x, y)| OcvPoint::new(*x as i32, *y as i32)) |             .map(|(x, y)| OcvPoint::new(*x as i32, *y as i32)) | ||||||
|             .collect(); |             .collect(); | ||||||
|         //let dst = [(0, 0), (0, size), (size, size), (size, 0)]; // in: laser repere
 |         //let dst = [(0, 0), (0, size), (size, size), (size, 0)]; // in: laser repere
 | ||||||
|         let dst = [(0, size), (0, 0), (size, 0), (size, size)]; |         let dst = [(size, size), (size, 0), (0, 0), (0, size)]; | ||||||
|         let dst_corners: Vec<OcvPoint> = dst.iter().map(|(x, y)| OcvPoint::new(*x, *y)).collect(); |         let dst_corners: Vec<OcvPoint> = dst.iter().map(|(x, y)| OcvPoint::new(*x, *y)).collect(); | ||||||
|         let roi_corners_mat = Mat::from_slice(&roi_corners[..])?; |         let roi_corners_mat = Mat::from_slice(&roi_corners[..])?; | ||||||
|         let dst_corners_mat = Mat::from_slice(&dst_corners)?; |         let dst_corners_mat = Mat::from_slice(&dst_corners)?; | ||||||
| @ -163,17 +166,17 @@ impl Sequence for InitBorder { | |||||||
|         )?; //get homography
 |         )?; //get homography
 | ||||||
|         mem.homography = h.clone(); |         mem.homography = h.clone(); | ||||||
|         mem.h_size = warped_image_size.clone(); |         mem.h_size = warped_image_size.clone(); | ||||||
|         //let mut warped_image = Mat::default();
 |         let mut warped_image = Mat::default(); | ||||||
|         //imgproc::warp_perspective(
 |         imgproc::warp_perspective( | ||||||
|         //    &mixed,
 |             &mixed, | ||||||
|         //    &mut warped_image,
 |             &mut warped_image, | ||||||
|         //    &h,
 |             &h, | ||||||
|         //    warped_image_size,
 |             warped_image_size, | ||||||
|         //    imgproc::INTER_CUBIC, // I dont see difference with INTER_CUBIC
 |             imgproc::INTER_CUBIC, // I dont see difference with INTER_CUBIC
 | ||||||
|         //    core::BORDER_CONSTANT,
 |             BORDER_CONSTANT, | ||||||
|         //    Scalar::default(),
 |             Scalar::default(), | ||||||
|         //)?; // do perspective transformation
 |         )?; // do perspective transformation
 | ||||||
|         //highgui::imshow("Warped Image", &warped_image)?;
 |         highgui::imshow("Warped Image", &warped_image)?; | ||||||
|         self.finished = true; |         self.finished = true; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| @ -181,6 +184,14 @@ impl Sequence for InitBorder { | |||||||
|     fn is_capture(&self) -> bool { |     fn is_capture(&self) -> bool { | ||||||
|         true |         true | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn sequence_name(&self) -> String { | ||||||
|  |         "Init_Border".to_owned() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn wait_milis(&self) -> u64 { | ||||||
|  |         self.nb_millis | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn get_lines( | pub fn get_lines( | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ use crate::{ | |||||||
|     draw::draw_line_dotted, |     draw::draw_line_dotted, | ||||||
|     point::Point, |     point::Point, | ||||||
|     qualibration::{ |     qualibration::{ | ||||||
|         annalyse::{get_horizontal_segment, image_diff}, |         annalyse::{get_horizontal_segment, get_vertical_segment, image_diff}, | ||||||
|         compute_image::{image_treshold, image_warp}, |         compute_image::{image_treshold, image_warp}, | ||||||
|         param::Param, |         param::Param, | ||||||
|         Sequence, |         Sequence, | ||||||
| @ -29,15 +29,17 @@ pub struct InitIdcode { | |||||||
|     cnt: usize, |     cnt: usize, | ||||||
|     beg: Point, |     beg: Point, | ||||||
|     end: Point, |     end: Point, | ||||||
|  |     nb_millis: u64, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl InitIdcode { | impl InitIdcode { | ||||||
|     pub fn new(beg: Point, end: Point) -> InitIdcode { |     pub fn new(beg: Point, end: Point, nb_millis: u64) -> InitIdcode { | ||||||
|         InitIdcode { |         InitIdcode { | ||||||
|             finished: false, |             finished: false, | ||||||
|             cnt: 0, |             cnt: 0, | ||||||
|             beg, |             beg, | ||||||
|             end, |             end, | ||||||
|  |             nb_millis, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -99,7 +101,16 @@ impl Sequence for InitIdcode { | |||||||
|         self.finished = true; |         self.finished = true; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     fn is_capture(&self) -> bool { |     fn is_capture(&self) -> bool { | ||||||
|         true |         true | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn sequence_name(&self) -> String { | ||||||
|  |         "init_Id-Code".to_owned() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn wait_milis(&self) -> u64 { | ||||||
|  |         self.nb_millis | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,11 +1,14 @@ | |||||||
| use crate::point::{Color, Point}; | use crate::{ | ||||||
| use crate::qualibration::{ |     point::{Color, Point}, | ||||||
|     annalyse::{ |     qualibration::{ | ||||||
|         draw_histograme_bgr_tresh, get_horizontal_segment, get_vertical_segment, histogram_3d, |         annalyse::{ | ||||||
|         image_diff, |             draw_histograme_bgr_tresh, get_horizontal_segment, get_vertical_segment, histogram_3d, | ||||||
|  |             image_diff, | ||||||
|  |         }, | ||||||
|  |         compute_image::{image_treshold, image_warp}, | ||||||
|  |         param::Param, | ||||||
|  |         Sequence, | ||||||
|     }, |     }, | ||||||
|     param::Param, |  | ||||||
|     Sequence, |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use opencv::{ | use opencv::{ | ||||||
| @ -20,6 +23,7 @@ opencv::opencv_branch_4! { | |||||||
| } | } | ||||||
| opencv::not_opencv_branch_4! { | opencv::not_opencv_branch_4! { | ||||||
|     use opencv::core::LINE_AA; |     use opencv::core::LINE_AA; | ||||||
|  |     use opencv::imgproc::LINE_8; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| @ -30,10 +34,12 @@ pub struct LineDotted { | |||||||
|     end: Point, |     end: Point, | ||||||
|     continuous_y: bool, |     continuous_y: bool, | ||||||
|     continuous_x: bool, |     continuous_x: bool, | ||||||
|  |     nb_millis: u64, | ||||||
|  |     factor: usize, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl LineDotted { | impl LineDotted { | ||||||
|     pub fn new(beg: Point, end: Point, continuous_y: bool, continuous_x: bool) -> Self { |     pub fn new(beg: Point, end: Point, factor: usize, continuous_y: bool, continuous_x: bool, nb_millis: u64) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             finished: false, |             finished: false, | ||||||
|             cnt: 0, |             cnt: 0, | ||||||
| @ -41,6 +47,8 @@ impl LineDotted { | |||||||
|             end, |             end, | ||||||
|             continuous_x, |             continuous_x, | ||||||
|             continuous_y, |             continuous_y, | ||||||
|  |             factor, | ||||||
|  |             nb_millis, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -55,36 +63,47 @@ impl Sequence for LineDotted { | |||||||
|         } |         } | ||||||
|         let nb_all = mem.nb_all; |         let nb_all = mem.nb_all; | ||||||
|         let nb_wait = mem.nb_wait as usize; |         let nb_wait = mem.nb_wait as usize; | ||||||
|         let nb_visible = mem.nb_visible as usize; |         //let nb_visible = mem.nb_visible as usize;
 | ||||||
|  |         let len = (self.factor * mem.line_pos.len() + nb_wait) as f32; | ||||||
|         let mut pl = vec![]; |         let mut pl = vec![]; | ||||||
|  |         let black = Color { r: 0, g: 0, b: 0 }; | ||||||
|         let color = Color { |         let color = Color { | ||||||
|             r: mem.r as u8, |             r: mem.r as u8, | ||||||
|             g: mem.g as u8, |             g: mem.g as u8, | ||||||
|             b: mem.b as u8, |             b: mem.b as u8, | ||||||
|         }; |         }; | ||||||
|         let black = Color { r: 0, g: 0, b: 0 }; | 
 | ||||||
|  |         // go to firsst point
 | ||||||
|         for _ in 0..nb_all { |         for _ in 0..nb_all { | ||||||
|             pl.push(Point { |             pl.push(Point { | ||||||
|                 color: black, |                 color: black, | ||||||
|                 ..self.beg |                 ..self.beg | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         let len = (2 * mem.line_pos.len() + nb_wait) as f32; | 
 | ||||||
|  |         // go on the continus_axes in black to gain speed
 | ||||||
|         for i in 0..nb_wait { |         for i in 0..nb_wait { | ||||||
|             let val_x = i as f32 / len * (self.end.x - self.beg.x) + self.beg.x; |             let val_x = self.end.x;//i as f32 / len * (self.end.x - self.beg.x) + self.beg.x;
 | ||||||
|             let val_y = i as f32 / len * (self.end.y - self.beg.y) + self.beg.y; |             let val_y = self.end.y;//i as f32 / len * (self.end.y - self.beg.y) + self.beg.y;
 | ||||||
|             pl.push(Point { |             pl.push(Point { | ||||||
|                 x: if self.continuous_x { val_x } else { self.beg.x }, |                 x: if self.continuous_x { val_x } else { self.beg.x }, | ||||||
|                 y: if self.continuous_y { val_y } else { self.beg.y }, |                 y: if self.continuous_y { val_y } else { self.beg.y }, | ||||||
|                 color: black, |                 color: black, | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         for i in 0..(mem.line_pos.len() * 2) { | 
 | ||||||
|  |         // donne each pose lavue acording to the slide bar value and the continus axes
 | ||||||
|  |         for i in 0..(mem.line_pos.len() * self.factor) { | ||||||
|             let val_cont_x = (i + nb_wait) as f32 / len * (self.end.x - self.beg.x) + self.beg.x; |             let val_cont_x = (i + nb_wait) as f32 / len * (self.end.x - self.beg.x) + self.beg.x; | ||||||
|             let val_cont_y = (i + nb_wait) as f32 / len * (self.end.y - self.beg.y) + self.beg.y; |             let val_cont_y = (i + nb_wait) as f32 / len * (self.end.y - self.beg.y) + self.beg.y; | ||||||
|             let val_x = mem.line_pos[i / 2] as f32 + self.beg.x; |             let val_x = mem.line_pos[i / self.factor] as f32 + self.beg.x; | ||||||
|             let val_y = mem.line_pos[i / 2] as f32 + self.beg.y; |             let val_y = mem.line_pos[i / self.factor] as f32 + self.beg.y; | ||||||
|             let is_visible = (i + nb_wait) % 2 == 0 && i < nb_visible; |             //let is_visible = (i + nb_wait) % 2 == 0;// && i < nb_visible;
 | ||||||
|  |             let is_visible = match (self.cnt, i) { | ||||||
|  |                 (1, _) => true, | ||||||
|  |                 (2, i) => i & 1 == 0, | ||||||
|  |                 (cnt, i) => i & (1 << (cnt - 3)) != 0, | ||||||
|  |             }; | ||||||
|             let c = if is_visible { color } else { black }; |             let c = if is_visible { color } else { black }; | ||||||
|             pl.push(Point { |             pl.push(Point { | ||||||
|                 x: if self.continuous_x { val_cont_x } else { val_x }, |                 x: if self.continuous_x { val_cont_x } else { val_x }, | ||||||
| @ -97,52 +116,37 @@ impl Sequence for LineDotted { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>> { |     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>> { | ||||||
|         if self.cnt < 1 { |         if self.cnt <= ((self.factor * mem.line_pos.len()) as f64).log2() as usize + 2 { | ||||||
|             self.cnt += 1; |             self.cnt += 1; | ||||||
|  |             return Ok(()) | ||||||
|         } |         } | ||||||
|         let ids = mem.seq_id; |             //let len = ((self.factor * mem.line_pos.len()) as f64).log2() as usize + 1;
 | ||||||
|         let background = mem.imgs[ids][0].to_owned(); |  | ||||||
|         let line_dot = mem.imgs[ids][1].to_owned(); |  | ||||||
|         let diff = image_diff(&background, &line_dot)?; |  | ||||||
| 
 | 
 | ||||||
|         let mut warped_image = Mat::default(); |         //if self.cnt > ((self.factor * mem.line_pos.len()) as f64).log2() as usize + 1 {
 | ||||||
|         imgproc::warp_perspective( |         //    if mem.capture_mode {
 | ||||||
|             &diff, |         //        self.finished = true;
 | ||||||
|             &mut warped_image, |         //    } else {
 | ||||||
|             &mem.homography, |         //        self.cnt = 0;
 | ||||||
|             mem.h_size, |         //    }
 | ||||||
|             imgproc::INTER_CUBIC, // I dont see difference with INTER_CUBIC
 |         //    return Ok(())
 | ||||||
|             BORDER_CONSTANT, |         //}
 | ||||||
|             Scalar::default(), |         //println!("Groboulli: {}", line!());
 | ||||||
|         )?; |         let ids = mem.seq_id; | ||||||
|         //highgui::imshow("Warped Image", &warped_image)?;
 |         let img_len = mem.imgs[ids].len(); | ||||||
|  |         let img_id = 2;//(img_len-1).min(self.cnt);
 | ||||||
|  | 
 | ||||||
|  |         let background = mem.imgs[ids][0].to_owned(); | ||||||
|  |         let line_dot = mem.imgs[ids][img_id].to_owned(); | ||||||
|  |         let diff = image_diff(&line_dot, &background)?; | ||||||
|  |         //highgui::imshow("lone dotted", &diff)?;
 | ||||||
|  | 
 | ||||||
|  |         let warped_image = image_warp(&diff, &mem.homography, mem.h_size)?; | ||||||
|  |         let mut bord_treshed = image_treshold(&warped_image, &mem.tresh)?; | ||||||
|  |         highgui::imshow("Warped and treshed Image", &bord_treshed)?; | ||||||
| 
 | 
 | ||||||
|         let histo = histogram_3d(&warped_image, mem.nb_liss)?; |         let histo = histogram_3d(&warped_image, mem.nb_liss)?; | ||||||
|         draw_histograme_bgr_tresh("histo bgr", &histo, &mem.tresh)?; |         draw_histograme_bgr_tresh("histo bgr", &histo, &mem.tresh)?; | ||||||
| 
 | 
 | ||||||
|         let (t1, s1, l1) = ( |  | ||||||
|             mem.tresh.min_0 as f64, |  | ||||||
|             mem.tresh.min_1 as f64, |  | ||||||
|             mem.tresh.min_2 as f64, |  | ||||||
|         ); |  | ||||||
|         let (t2, s2, l2) = ( |  | ||||||
|             mem.tresh.max_0 as f64, |  | ||||||
|             mem.tresh.max_1 as f64, |  | ||||||
|             mem.tresh.max_2 as f64, |  | ||||||
|         ); |  | ||||||
|         let min = Mat::from_slice(&[t1, s1, l1])?; |  | ||||||
|         let max = Mat::from_slice(&[t2, s2, l2])?; |  | ||||||
|         let mut color_selected = Mat::default(); |  | ||||||
|         let _ = in_range(&warped_image, &min, &max, &mut color_selected); |  | ||||||
|         let mut bord_treshed = Mat::default(); |  | ||||||
|         bitwise_and( |  | ||||||
|             &warped_image, |  | ||||||
|             &warped_image, |  | ||||||
|             &mut bord_treshed, |  | ||||||
|             &color_selected, |  | ||||||
|         )?; |  | ||||||
|         //highgui::imshow(format!("warped_image & mask").as_str(), &bord_treshed)?;
 |  | ||||||
| 
 |  | ||||||
|         let segments = if self.continuous_y { |         let segments = if self.continuous_y { | ||||||
|             get_vertical_segment(&bord_treshed)? |             get_vertical_segment(&bord_treshed)? | ||||||
|         } else { |         } else { | ||||||
| @ -158,10 +162,18 @@ impl Sequence for LineDotted { | |||||||
|             line(&mut bord_treshed, a, b, color, 1, LINE_8, 0)?; |             line(&mut bord_treshed, a, b, color, 1, LINE_8, 0)?; | ||||||
|         } |         } | ||||||
|         highgui::imshow("segemnt detector", &bord_treshed)?; |         highgui::imshow("segemnt detector", &bord_treshed)?; | ||||||
|  |         self.cnt += 1; | ||||||
|         self.finished = true; |         self.finished = true; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|     fn is_capture(&self) -> bool { |     fn is_capture(&self) -> bool { | ||||||
|         true |         true | ||||||
|     } |     } | ||||||
|  |     fn sequence_name(&self) -> String { | ||||||
|  |         "line_Dotted".to_owned() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn wait_milis(&self) -> u64 { | ||||||
|  |         self.nb_millis | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -5,11 +5,12 @@ use opencv::Result; | |||||||
| #[derive(Debug, Clone, Copy)] | #[derive(Debug, Clone, Copy)] | ||||||
| pub struct LoadImage { | pub struct LoadImage { | ||||||
|     finished: bool, |     finished: bool, | ||||||
|  |     nb_millis: u64, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl LoadImage { | impl LoadImage { | ||||||
|     pub fn new() -> LoadImage { |     pub fn new() -> LoadImage { | ||||||
|         LoadImage { finished: false } |         LoadImage { finished: false, nb_millis: 0 } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -20,6 +21,7 @@ impl Sequence for LoadImage { | |||||||
|         } |         } | ||||||
|         Some(vec![]) |         Some(vec![]) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>> { |     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>> { | ||||||
|         if !mem.capture_mode { |         if !mem.capture_mode { | ||||||
|             mem.load_image()?; |             mem.load_image()?; | ||||||
| @ -27,7 +29,16 @@ impl Sequence for LoadImage { | |||||||
|         self.finished = true; |         self.finished = true; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     fn is_capture(&self) -> bool { |     fn is_capture(&self) -> bool { | ||||||
|         false |         false | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn sequence_name(&self) -> String { | ||||||
|  |         "Load_Image".to_owned() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn wait_milis(&self) -> u64 { | ||||||
|  |         self.nb_millis | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -5,11 +5,12 @@ use opencv::Result; | |||||||
| #[derive(Debug, Clone, Copy)] | #[derive(Debug, Clone, Copy)] | ||||||
| pub struct SaveImage { | pub struct SaveImage { | ||||||
|     finished: bool, |     finished: bool, | ||||||
|  |     nb_millis: u64, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl SaveImage { | impl SaveImage { | ||||||
|     pub fn new() -> SaveImage { |     pub fn new() -> SaveImage { | ||||||
|         SaveImage { finished: false } |         SaveImage { finished: false, nb_millis: 0} | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -20,12 +21,22 @@ impl Sequence for SaveImage { | |||||||
|         } |         } | ||||||
|         Some(vec![]) |         Some(vec![]) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>> { |     fn compute_sequence(&mut self, mem: &mut Param) -> Result<(), Box<dyn std::error::Error>> { | ||||||
|         mem.save_image()?; |         mem.save_image()?; | ||||||
|         self.finished = true; |         self.finished = true; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     fn is_capture(&self) -> bool { |     fn is_capture(&self) -> bool { | ||||||
|         false |         false | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn sequence_name(&self) -> String { | ||||||
|  |         "Save_Image".to_owned() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn wait_milis(&self) -> u64 { | ||||||
|  |         self.nb_millis | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,16 +9,13 @@ use opencv::Result; | |||||||
| #[derive(Debug, Clone, Copy)] | #[derive(Debug, Clone, Copy)] | ||||||
| pub struct WaitSpace { | pub struct WaitSpace { | ||||||
|     borders: [Point; 4], |     borders: [Point; 4], | ||||||
|     red: [Point; 2], |     mid: [Point; 2], | ||||||
|     green: [Point; 2], |     nb_millis: u64, | ||||||
|     blue: [Point; 2], |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl WaitSpace { | impl WaitSpace { | ||||||
|     pub fn new(beg: Point, end: Point) -> Self { |     pub fn new(beg: Point, end: Point, nb_millis: u64) -> Self { | ||||||
|         let red_y = (end.y - beg.y) * 1./5. + beg.y; |         let mid = (end.y - beg.y) * 0.5 + beg.y; | ||||||
|         let green_y = (end.y - beg.y) * 2./5. + beg.y; |  | ||||||
|         let blue_y = (end.y - beg.y) * 3./5. + beg.y; |  | ||||||
|         Self { |         Self { | ||||||
|             borders: [ |             borders: [ | ||||||
|                 Point { |                 Point { | ||||||
| @ -42,42 +39,19 @@ impl WaitSpace { | |||||||
|                     color: end.color, |                     color: end.color, | ||||||
|                 }, |                 }, | ||||||
|             ], |             ], | ||||||
|             red: [ |             mid: [ | ||||||
|                 Point { |                 Point { | ||||||
|                     x: beg.x, |                     x: beg.x, | ||||||
|                     y: red_y, |                     y: mid, | ||||||
|                     color: end.color, |                     color: end.color, | ||||||
|                 }, |                 }, | ||||||
|                 Point { |                 Point { | ||||||
|                     x: end.x, |                     x: end.x, | ||||||
|                     y: red_y, |                     y: mid, | ||||||
|                     color: end.color, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             blue: [ |  | ||||||
|                 Point { |  | ||||||
|                     x: beg.x, |  | ||||||
|                     y: blue_y, |  | ||||||
|                     color: end.color, |  | ||||||
|                 }, |  | ||||||
|                 Point { |  | ||||||
|                     x: end.x, |  | ||||||
|                     y: blue_y, |  | ||||||
|                     color: end.color, |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             green: [ |  | ||||||
|                 Point { |  | ||||||
|                     x: beg.x, |  | ||||||
|                     y: green_y, |  | ||||||
|                     color: end.color, |  | ||||||
|                 }, |  | ||||||
|                 Point { |  | ||||||
|                     x: end.x, |  | ||||||
|                     y: green_y, |  | ||||||
|                     color: end.color, |                     color: end.color, | ||||||
|                 }, |                 }, | ||||||
|             ], |             ], | ||||||
|  |             nb_millis, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -94,21 +68,6 @@ impl Sequence for WaitSpace { | |||||||
|             g: mem.g as u8, |             g: mem.g as u8, | ||||||
|             b: mem.b as u8, |             b: mem.b as u8, | ||||||
|         }; |         }; | ||||||
|         let red = Color { |  | ||||||
|             r: mem.r as u8, |  | ||||||
|             g: 0, |  | ||||||
|             b: 0, |  | ||||||
|         }; |  | ||||||
|         let green = Color { |  | ||||||
|             r: 0, |  | ||||||
|             g: mem.g as u8, |  | ||||||
|             b: 0, |  | ||||||
|         }; |  | ||||||
|         let blue = Color { |  | ||||||
|             r: 0, |  | ||||||
|             g: 0, |  | ||||||
|             b: mem.b as u8, |  | ||||||
|         }; |  | ||||||
|         for i in 0..self.borders.len() { |         for i in 0..self.borders.len() { | ||||||
|             let id1 = (i + 1) % self.borders.len(); |             let id1 = (i + 1) % self.borders.len(); | ||||||
|             let p0 = Point { |             let p0 = Point { | ||||||
| @ -126,44 +85,18 @@ impl Sequence for WaitSpace { | |||||||
|                 mem.nb_visible as usize, |                 mem.nb_visible as usize, | ||||||
|             )); |             )); | ||||||
|             pl.extend(draw_line_dotted( |             pl.extend(draw_line_dotted( | ||||||
|                 &Point{ |                 &Point { | ||||||
|                     color: blue, |                     color, | ||||||
|                     ..self.blue[0] |                     ..self.mid[0] | ||||||
|                 }, |                 }, | ||||||
|                 &Point{ |                 &Point { | ||||||
|                     color: blue, |                     color, | ||||||
|                     ..self.blue[1] |                     ..self.mid[1] | ||||||
|                 }, |                 }, | ||||||
|                 mem.nb_all as usize, |                 mem.nb_all as usize, | ||||||
|                 mem.nb_visible as usize, |                 mem.nb_visible as usize, | ||||||
|                 true, |                 true, | ||||||
|                     )); |             )); | ||||||
|             pl.extend(draw_line_dotted( |  | ||||||
|                 &Point{ |  | ||||||
|                     color: green, |  | ||||||
|                     ..self.green[0] |  | ||||||
|                 }, |  | ||||||
|                 &Point{ |  | ||||||
|                     color: green, |  | ||||||
|                     ..self.green[1] |  | ||||||
|                 }, |  | ||||||
|                 mem.nb_all as usize, |  | ||||||
|                 mem.nb_visible as usize, |  | ||||||
|                 true, |  | ||||||
|                     )); |  | ||||||
|             pl.extend(draw_line_dotted( |  | ||||||
|                 &Point{ |  | ||||||
|                     color: red, |  | ||||||
|                     ..self.red[0] |  | ||||||
|                 }, |  | ||||||
|                 &Point{ |  | ||||||
|                     color: red, |  | ||||||
|                     ..self.red[1] |  | ||||||
|                 }, |  | ||||||
|                 mem.nb_all as usize, |  | ||||||
|                 mem.nb_visible as usize, |  | ||||||
|                 true, |  | ||||||
|                     )); |  | ||||||
|         } |         } | ||||||
|         Some(pl) |         Some(pl) | ||||||
|     } |     } | ||||||
| @ -173,4 +106,12 @@ impl Sequence for WaitSpace { | |||||||
|     fn is_capture(&self) -> bool { |     fn is_capture(&self) -> bool { | ||||||
|         false |         false | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn sequence_name(&self) -> String { | ||||||
|  |         "Wait_Space".to_owned() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn wait_milis(&self) -> u64 { | ||||||
|  |         self.nb_millis | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user