rust 使用 opencv 图像计算 加减乘除 图像取反

291 阅读3分钟

通过使用+ -号进行计算

mod examples;
use opencv::core::{MatExprResult};
use opencv::highgui::{
    //显示窗口
    imshow,
    //创建命名窗口
    named_window,
    //摧毁所有窗口
    destroy_all_windows,
    //等待用户输入
    wait_key
};

use opencv::imgcodecs::imread;
use opencv::prelude::{MatTraitConst, MatExprTraitConst};
use opencv::core::{Mat,Scalar};


fn main() {
    //创建窗体 window
    let _ = named_window("window", opencv::highgui::WINDOW_NORMAL);
    //读取图片
    let src1 = imread("2.png", opencv::imgcodecs::IMREAD_ANYCOLOR).unwrap();
    
    let scale = Scalar::new(40., 40., 40., 40.);

    let src2 = Mat::new_rows_cols_with_default(src1.rows(), src1.cols(), opencv::core::CV_8UC3, scale).unwrap();
    println!("ch1 = {}",src1.channels());
    println!("ch2 = {}",src2.channels());

    let des = &src1 + src2;

    match des {
        MatExprResult::Ok(mat) => {
            let m = mat.to_mat().unwrap();
            imshow("window2", &m).unwrap();
        }
        MatExprResult::Err(err) =>{

        }
    }
    
    imshow("window1", &src1).unwrap();

    let _ = wait_key(0);
    let _ = destroy_all_windows();
}

使用add方法进行 加法计算

use opencv::core::add;

///加法
pub fn add(
    src1: &dyn ToInputArray,
    src2: &dyn ToInputArray,
    dst: &mut dyn ToOutputArray,
    mask: &dyn ToInputArray,
    dtype: i32
) -> Result<()>

src1: first input array or a scalar.
src2: second input array or a scalar.
dst: output array that has the same size and number of channels as the input array(s); the depth is defined by dtype or src1/src2.
mask: optional operation mask - 8-bit single channel array, that specifies elements of the output array to be changed.
dtype: optional depth of the output array (see the discussion below).

default 
mask: noArray()
dtype: -1

使用subtract方法进行减法计算

opencv::core::subtract
///减法
pub fn subtract(
    src1: &dyn ToInputArray,
    src2: &dyn ToInputArray,
    dst: &mut dyn ToOutputArray,
    mask: &dyn ToInputArray,
    dtype: i32
) -> Result<()>

src1: first input array or a scalar.
src2: second input array or a scalar.
dst: output array of the same size and the same number of channels as the input array.
mask: optional operation mask; this is an 8-bit single channel array that specifies elements of the output array to be changed.
dtype: optional depth of the output array

default
mask: noArray()
dtype: -1

使用multiply进行乘法计算

use opencv::core::multiply;
///乘法
pub fn multiply(
    src1: &dyn ToInputArray,
    src2: &dyn ToInputArray,
    dst: &mut dyn ToOutputArray,
    scale: f64,
    dtype: i32
) -> Result<()>

src1: first input array.
src2: second input array of the same size and the same type as src1.
dst: output array of the same size and type as src1.
scale: optional scale factor.
dtype: optional depth of the output array

default
scale: 1
dtype: -1

使用divide除法计算

use opencv::core::divide;
///除法
pub fn divide(
    scale: f64,
    src2: &dyn ToInputArray,
    dst: &mut dyn ToOutputArray,
    dtype: i32
) -> Result<()>


src1: first input array.
src2: second input array of the same size and type as src1.
scale: scalar factor.
dst: output array of the same size and type as src2.
dtype: optional depth of the output array; if -1, dst will have depth src2.depth(), but in case of an array-by-array division, you can only pass -1 when src1.depth()==src2.depth().

default
dtype: -1

\

加减乘除的代码演示

mod examples;
use opencv::core::{MatExprResult, ToInputArray, ToOutputArray};
use opencv::core::prelude::MatOpConst;
use opencv::core::{add,subtract,multiply,divide2};
use opencv::highgui::{
    //显示窗口
    imshow,
    //创建命名窗口
    named_window,
    //摧毁所有窗口
    destroy_all_windows,
    //等待用户输入
    wait_key
};

use opencv::imgcodecs::imread;
use opencv::prelude::{MatTraitConst, MatExprTraitConst};
use opencv::core::{Mat,Scalar};


fn main() {
    //创建窗体 window
    //let _ = named_window("window", opencv::highgui::WINDOW_NORMAL);
    //读取图片
    let src1 = imread("2.png", opencv::imgcodecs::IMREAD_ANYCOLOR).unwrap();
    
    let scale = Scalar::new(40., 40.,40.,40.);

    let src2 = Mat::new_rows_cols_with_default(src1.rows(), src1.cols(), opencv::core::CV_8UC3, scale).unwrap();
    
    //加法
    let mut out_add_image = Mat::default();
    let _ = add(&src1.input_array().unwrap(), &src2.input_array().unwrap(), &mut out_add_image.output_array().unwrap(),&Mat::default().input_array().unwrap(), -1);
    imshow("add", &out_add_image).unwrap();

    //减法
    let mut out_subtract_image = Mat::default();
    let _ = subtract(&src1.input_array().unwrap(), &src2.input_array().unwrap(), &mut out_subtract_image.output_array().unwrap(),&Mat::default().input_array().unwrap(), -1);
    imshow("subtract", &out_subtract_image).unwrap();
    
    //乘法
    let mut out_multiply_image = Mat::default();
    let _ = multiply(&src1.input_array().unwrap(), &src2.input_array().unwrap(), &mut out_multiply_image.output_array().unwrap(), 1., -1);
    imshow("multiply", &out_multiply_image).unwrap();

    let mut out_divide_image = Mat::default();
    let _ = divide2(&src1.input_array().unwrap(), &src2.input_array().unwrap(), &mut out_divide_image.output_array().unwrap(), 1.,-1);
    imshow("divide", &out_divide_image).unwrap();

    let _ = wait_key(0);
    let _ = destroy_all_windows();
}


///显示图片
fn _show(){
    //创建窗体 window
    let _ = named_window("window", opencv::highgui::WINDOW_NORMAL);
    //读取图片
    let image = imread("2.png", opencv::imgcodecs::IMREAD_COLOR).unwrap();
    //显示读取到的图片
    imshow("window", &image).unwrap();
    //等待用户输入,不然窗口就会立刻关闭
    let _ = wait_key(0);
    //销毁所有窗体
    let _ = destroy_all_windows();
}

图像取反

use opencv::core::bitwise_not;
pub fn bitwise_not(
    src: &dyn ToInputArray,
    dst: &mut dyn ToOutputArray,
    mask: &dyn ToInputArray
) -> Result<()>

src: input array.
dst: output array that has the same size and type as the input array.
mask: optional operation mask, 8-bit single channel array, that specifies elements of the output array to be changed

default
mask: noArray()
mod examples;
use opencv::core::{ ToInputArray, ToOutputArray, Vec3b, Vec3i};
use opencv::core::{add,bitwise_not};
use opencv::highgui::{
    //显示窗口
    imshow,
    //创建命名窗口
    named_window,
    //摧毁所有窗口
    destroy_all_windows,
    //等待用户输入
    wait_key
};

use opencv::imgcodecs::imread;
use opencv::prelude::{MatTraitConst, MatTrait};
use opencv::core::{Mat,Scalar};


fn main() {
    //创建窗体 window
    //let _ = named_window("window", opencv::highgui::WINDOW_NORMAL);
    //读取图片
    let src1 = imread("2.png", opencv::imgcodecs::IMREAD_ANYCOLOR).unwrap();
    
    let scale = Scalar::new(0., 0.,0.,0.);

    let mut src2 = Mat::new_rows_cols_with_default(src1.rows(), src1.cols(), opencv::core::CV_8UC1, scale).unwrap();
    
    //只取一半
    for row in 0..src2.rows(){
        for col in 0..src2.cols()/2{
            let mut mut_2d = src2.at_2d_mut::<u8>(row, col).unwrap();
            *mut_2d = 255;
        }
    }

    //图像取反
    let mut out_add_image = Mat::default();
    let _ = bitwise_not(&src1.input_array().unwrap(), &mut out_add_image.output_array().unwrap(),&src2.input_array().unwrap());
    imshow("add", &out_add_image).unwrap();


    let _ = wait_key(0);
    let _ = destroy_all_windows();
}

\