mmdeploy 1.1.0

Safe MMDeploy Rust wrapper
extern crate mmdeploy;
extern crate opencv;
extern crate rand;

use std::env;

use opencv::{
    core::{CV_8UC3, Vec3b},
    prelude::*,
    types::VectorOfi32,
    imgcodecs::{imread, imwrite, IMREAD_COLOR},
};

pub use mmdeploy::segmentor::{segmentor_create_by_path, segmentor_apply, segmentor_release_result, segmentor_release};
use rand::Rng;


fn gen_palette(num_classes: i32) -> Vec<Vec<u8>> {
    let mut rng = rand::thread_rng();

    let mut palette = Vec::new();

    for _i in 0..num_classes {
        let r = rng.gen_range(0..255) as u8;
        let g = rng.gen_range(0..255) as u8;
        let b = rng.gen_range(0..255) as u8;

        let mut color = Vec::new();
        color.push(r);
        color.push(g);
        color.push(b);
        
        palette.push(color);
    }
    palette

}

fn main() {
    let args: Vec<String> = env::args().collect();

    let device_name = &args[1];
    let model_path = &args[2];
    let image_path = &args[3];

    // opencv
    let img = imread(image_path, IMREAD_COLOR).unwrap();

    let segmentor = segmentor_create_by_path(model_path, device_name, 0).unwrap();

    let seg_result = segmentor_apply(segmentor, &img, 1).unwrap();
    
    let result = seg_result.get_result(0, 0);

    let palette = gen_palette(result.classes + 1);
    
    let color_mask = Mat::zeros(result.height, result.width, CV_8UC3).unwrap();

    let mut color_mat = Box::new(color_mask.to_mat().unwrap());

    for row in 0..color_mat.rows() {
        for col in 0..color_mat.cols() {
            let colors = palette[result.get_mask(row * color_mat.cols()+col) as usize].clone();
            let mask = color_mat.at_2d_mut::<Vec3b>(row, col).unwrap();
            mask[0] += colors[0];
            mask[1] += colors[1];
            mask[2] += colors[2];
        }
    }
    
    let img = match (img * 0.5 + *color_mat * 0.5).into_result() {
        Ok(matexpr) => matexpr,
        Err(error) => panic!("{}", error),
    };

    let params = VectorOfi32::new();

    let _succcess = imwrite("output_segmentation.png", &img, &params).unwrap();

    segmentor_release_result(seg_result, 1);
    segmentor_release(segmentor);

}