rust 使用 【opencv】读取图像显示

1,271 阅读4分钟

imread 读取图像

opencv::imgcodecs::imread

在文件中加载一个图像

支持读取的格式
  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Notesection)
  • JPEG 2000 files - *.jp2 (see the Notesection)
  • Portable Network Graphics - *.png (see the Notesection)
  • WebP - *.webp (see the Notesection)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • PFM files - *.pfm (see the Notesection)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Notesection)
  • OpenEXR Image files - *.exr (see the Notesection)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by GDAL (see the Note section)
pub fn imread(filename: &str, flags: i32) -> Result<Mat>
filename:文件位置、名称
flags:

IMREAD_ANYCOLOR: 以任何可能的颜色格式读取图像。

IMREAD_ANYDEPTH:在输入具有相应深度时返回 16 位/32 位图像,否则将其转换为 8 位。

IMREAD_COLOR:始终将图像转换为 3 通道 BGR 彩色图像。

IMREAD_GRAYSCALE:始终将图像转换为单通道灰度图像(编解码器内部转换)。

IMREAD_IGNORE_ORIENTATION:不要根据 EXIF 的方向标志旋转图像。

IMREAD_LOAD_GDAL:使用 gdal 驱动程序加载图像。

IMREAD_REDUCED_COLOR_2:始终将图像转换为 3 通道 BGR 彩色图像,并且图像尺寸减小 1/2。

IMREAD_REDUCED_COLOR_4:始终将图像转换为 3 通道 BGR 彩色图像,并且图像尺寸减小 1/4。

IMREAD_REDUCED_COLOR_8:始终将图像转换为 3 通道 BGR 彩色图像,并且图像尺寸减小 1/8。

IMREAD_REDUCED_GRAYSCALE_2:始终将图像转换为单通道灰度图像,并且图像尺寸减小 1/2。

IMREAD_REDUCED_GRAYSCALE_4:始终将图像转换为单通道灰度图像,图像尺寸缩小 1/4。

IMREAD_REDUCED_GRAYSCALE_8:始终将图像转换为单通道灰度图像,图像尺寸缩小 1/8。

IMREAD_UNCHANGED:按原样返回加载的图像(使用 alpha 通道,否则会被裁剪)。忽略 EXIF 方向。

named_window 创建一个窗体

pub fn named_window(winname: &str, flags: i32) -> Result<()>

winname:窗体名称

flags:

WINDOW_AUTOSIZE:用户无法调整窗口大小,大小受显示图像的限制。

WINDOW_FREERATIO:图像尽可能多地消耗(无比例限制)。

WINDOW_FULLSCREEN:将窗口更改为全屏。

WINDOW_GUI_EXPANDED:状态栏和工具栏

WINDOW_GUI_NORMAL:可以改变大小

WINDOW_KEEPRATIO:图像的比例

WINDOW_NORMAL:用户可以调整窗口大小(无约束)/也用于将全屏窗口切换到正常大小。

WINDOW_OPENGL:支持opengl的窗口。

WND_PROP_ASPECT_RATIO:窗口的纵横比(可以设置为 WINDOW_FREERATIO 或 WINDOW_KEEPRATIO)。

WND_PROP_AUTOSIZE: autosize 属性(可以是 WINDOW_NORMAL 或 WINDOW_AUTOSIZE)。

WND_PROP_FULLSCREEN:全屏属性(可以是 WINDOW_NORMAL 或 WINDOW_FULLSCREEN)。

WND_PROP_OPENGL:opengl 支持。

WND_PROP_TOPMOST:用于切换普通窗口是否处于最顶层的属性

WND_PROP_VISIBLE:检查窗口是否存在且可见

WND_PROP_VSYNC:启用或禁用 VSYNC(在 OpenGL 模式下)

imshow 显示窗体

pub fn imshow(winname: &str, mat: &dyn ToInputArray) -> Result<()>

winname:窗体名称

mat:图像

\

wiat_key 等待按键

pub fn wait_key(delay: i32) -> Result<i32>

destroy_all_windows 摧毁所有窗体

pub fn destroy_all_windows() -> Result<()>

\

下面我们实现使用opencv读取图片

创建rust项目

cargo new opencv_read_save

首先要确保你的电脑已经配置了opencv,如果没有的话可以看前面的文章对opencv进行配置

创建项目需要把opencv的dll拷贝到目录 target/debug或者是target/release

opencv\build\x64\vc14\bin\opencv_world440.dll

可能你的dll文件名称和我的版本不一样,但是这并不影响下面的教程。

把dll拷贝到项目路径

然后运行程序,因为现在还没有编写任何代码,将会输出hello world

cargo run

接下来我们介绍即将使用到的函数

imread:读取图像
named_window 创建窗体
imshow ****显示图像
wait_key 等待按键
destroy_all_windows 销毁窗体
如果想要获取图像的信息需要引入:opencv::prelude::*;

\

代码的编写

1、因为是通过opencv的窗体显示,所以需要创建一个窗体

let _ = named_window("window", opencv::highgui::WINDOW_AUTOSIZE);

2、通过imread读取图像(读取我最开始使用绝对地址,始终读取不到图像,后台我改成相对地址,把图片放到项目目录下,才可以读取出图像。)

let image = imread("2.png", opencv::imgcodecs::IMREAD_COLOR).unwrap();

3、使用imshow函数将图像显示到创建的窗体上面

imshow("window", &image).unwrap();

4、使用wait_key函数等待用户输入按键,暂停程序

let _ = wait_key(0);

5、停止程序销毁所有窗体

let _ = destroy_all_windows();

运行程序

\

完整代码

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

use opencv::imgcodecs::imread;


fn main() {
    //创建窗体 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();
}


后续更新.....