extern crate mmdeploy;
extern crate opencv;
use std::env;
use opencv::{
core::{Scalar, Rect},
types::VectorOfi32,
imgcodecs::{imread, imwrite, IMREAD_COLOR},
imgproc::{rectangle},
};
pub use mmdeploy::detector::{detector_create_by_path, detector_apply, detector_release_result, detector_release};
fn main() {
let args: Vec<String> = env::args().collect();
let device_name = &args[1];
let model_path = &args[2];
let image_path = &args[3];
let mut img = imread(image_path, IMREAD_COLOR).unwrap();
let detector = detector_create_by_path(model_path, device_name, 0).unwrap();
let det_result = detector_apply(detector, &img, 1).unwrap();
let result_count = det_result.get_result_count(0);
println!("bbox_count={}", result_count);
for i in 0..result_count {
let detection = det_result.get_result(0, i);
println!("box {}, left={}, top={}, right={}, bottom={}, label={}, score={}",
i,
detection.bbox.left,
detection.bbox.top,
detection.bbox.right,
detection.bbox.bottom,
detection.label_id,
detection.score);
if (detection.bbox.right - detection.bbox.left) < 1.0 || (detection.bbox.bottom - detection.bbox.top) < 1.0 {
continue;
}
if detection.score < 0.3 {
continue;
}
let width: i32 = (detection.bbox.right - detection.bbox.left) as i32;
let height: i32 = (detection.bbox.bottom - detection.bbox.top) as i32;
let rect: Rect = Rect {
x: detection.bbox.left as i32,
y: detection.bbox.top as i32,
width: width,
height: height,
};
let color: Scalar = Scalar::new(0.0, 255.0, 0.0, 0.0);
rectangle(&mut img, rect, color, 1, 8, 0).unwrap();
}
let params = VectorOfi32::new();
let _succcess = imwrite("output_detection.png", &img, ¶ms).unwrap();
detector_release_result(det_result, 1);
detector_release(detector);
}