|
1 | 1 | use anyhow::Result; |
2 | 2 | use derive_getters::Getters; |
3 | | -use opencv::{core::Size, prelude::Mat}; |
| 3 | +use itertools::MergeJoinBy; |
| 4 | +use opencv::core::{multiply, multiply_def, MatTraitManual, BORDER_CONSTANT, CV_8U}; |
| 5 | +use opencv::imgproc::{get_structuring_element, morphology_default_border_value, MORPH_RECT}; |
| 6 | +use opencv::{ |
| 7 | + core::{in_range, merge, split, Point, Scalar, Size, Vector}, |
| 8 | + imgproc::{ |
| 9 | + self, contour_area_def, cvt_color_def, dilate, find_contours_def, min_area_rect, |
| 10 | + CHAIN_APPROX_SIMPLE, COLOR_BGR2YUV, LINE_8, RETR_EXTERNAL, |
| 11 | + }, |
| 12 | + prelude::{Mat, MatTraitConst, MatTraitConstManual}, |
| 13 | +}; |
4 | 14 |
|
5 | 15 | use crate::load_onnx; |
6 | 16 |
|
@@ -102,7 +112,40 @@ impl YoloProcessor for GatePoles<OnnxModel> { |
102 | 112 | type Target = Target; |
103 | 113 |
|
104 | 114 | fn detect_yolo_v5(&mut self, image: &Mat) -> Vec<YoloDetection> { |
105 | | - self.model.detect_yolo_v5(image, self.threshold) |
| 115 | + let mut channels = Vector::<Mat>::new(); |
| 116 | + let _ = split(image, &mut channels).unwrap(); |
| 117 | + let b = channels.get(0).unwrap(); |
| 118 | + let g = channels.get(1).unwrap(); |
| 119 | + let r = channels.get(2).unwrap(); |
| 120 | + let mut mult_b = Mat::default(); |
| 121 | + let _ = multiply(&b, &1.0, &mut mult_b, 1.0, -1).unwrap(); |
| 122 | + let values = Vector::<Mat>::from_iter(vec![b, g, r]); |
| 123 | + let mut output_img = Mat::default(); |
| 124 | + let _ = merge(&values, &mut output_img).unwrap(); |
| 125 | + let mut dilated = Mat::default(); |
| 126 | + // let kernel = Vector::<Vector<i32>>::from_iter(vec![ |
| 127 | + // Vector::<i32>::from_iter(vec![1, 1, 1]), |
| 128 | + // Vector::<i32>::from_iter(vec![1, 1, 1]), |
| 129 | + // Vector::<i32>::from_iter(vec![1, 1, 1]), |
| 130 | + // ]); |
| 131 | + // let kernel = |
| 132 | + // get_structuring_element(MORPH_RECT, Size::new(3, 3), Point::new(-1, -1)).unwrap(); |
| 133 | + let kernel = Mat::ones_size(Size::new(3, 3), CV_8U).unwrap(); |
| 134 | + let _ = dilate( |
| 135 | + &output_img, |
| 136 | + &mut dilated, |
| 137 | + &kernel, |
| 138 | + Point::new(-1, -1), |
| 139 | + 1, |
| 140 | + BORDER_CONSTANT, |
| 141 | + morphology_default_border_value().unwrap(), |
| 142 | + ) |
| 143 | + .unwrap(); |
| 144 | + |
| 145 | + dbg!(image.dims()); |
| 146 | + dbg!(dilated.dims()); |
| 147 | + |
| 148 | + self.model.detect_yolo_v5(&dilated, self.threshold) |
106 | 149 | } |
107 | 150 |
|
108 | 151 | fn model_size(&self) -> Size { |
|
0 commit comments