本期的每周一库给大家带来的是 rust-cv,基于 rust 的计算机视觉库,首先放上库的仓库地址:

*rust-cv Github 仓库

插曲: opencv-rust

在正文开始之前写一些小插曲,本期的每周一库可谓一波三折,本着想跑一个 rust 下的 OpenCV 练练手,最开始选了 opencv-rust,不料环境配置非常复杂,始终没能跑起来。下面是一些也许能帮到大家的资料:

*opencv-rust 的 Github 仓库,简单介绍了库的详情

*opencv-rust 的 issue:Build opencv-rust fail in windows,阐述了错误详情,但是没有解决方案。

*Rust 论坛中关于 Computer Vision in Rust? 的帖子,介绍了一些 Computer Vision 在 Rust 下的替代方案。

综上来看,opencv-rust 的本地环境配置异常复杂,我使用的开发环境是 Windows 10,不但要编译 OpenCV 源代码,还需要设置一系列的环境变量,这里我测试的是 OpenCV 3.4.9 版本,环境变量配置如下,也许对大家有一些帮助,有 OpenCV C++开发经验的同学可能会发现这些配置项和 Visual Studio 中开发 OpenCV 工程时候很像:

*OPENCV_HEADER_DIR: BUILD_FOLDER_PATH\install\include\opencv2

*OPENCV_PACKAGE_NAME: opencv

*OPENCV_PYTHON3_BIN: PYTHON3_PATH\python.exe

*OPENCV_LINK_LIBS: opencv_calib3d349d.lib,opencv_core349d.lib,opencv_dnn349d.lib,opencv_features2d349d.lib,opencv_flann349d.lib,opencv_highgui349d.lib,opencv_imgcodecs349d.lib,opencv_imgproc349d.lib,opencv_ml349d.lib,opencv_objdetect349d.lib,opencv_photo349d.lib,opencv_shape349d.lib,opencv_stitching349d.lib,opencv_superres349d.lib,opencv_video349d.lib,opencv_videoio349d.lib,opencv_videostab349d.lib,opencv_viz349d.lib

*OPENCV_LINK_PATHS: BUILD_FOLDER_PATH\install\x64\vc15\lib

*OPENCV_INCLUDE_PATHS: BUILD_FOLDER_PATH\install\include\opencv2

但是,在 rust 工程中还是没能顺利调用 OpenCV。于是调转车头,开始了 rust-cv 库的探索,也就是本期每周一库的正文。

正文: rust-cv

接下来我们想实现的是一个基于 rust-cv 的图片读取和显示的简单程序,这里会详细记录配置步骤。

首先是开发环境:

*OS: Windows 10 Pro

*CMake 3.13.4

*MinGW64 7.0

接下来需要在本地安装 OpenCV:

创建目录 C:\opencv,复制 Github 仓库的 .git.windows 文件架到 opencv 目录中。

opencv 目录中以管理员身份运行 PowerShell,运行下面的命令

    PowerShell -NoExit -File (.\.windows\msvc_2_build_OCV.ps1 -EnableCuda $False -Compiler vc15)  

这里使用了 Visual Studio 2017 作为编译工具,也可以使用 MinGW 进行编译

运行命令后可能会遇到 因为在此系统上禁止运行脚本 的错误,可以参考这篇文章在管理员权限的 PowerShell 中使用命令来开启运行脚本权限 :

    set-executionpolicy remotesigned  

再接下来运行命令可能遇到 无法将“cmake”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的 拼写,如果包括路径,请确保路径正确,然后再试一次。 的错误,这时候可以通过把 CMake 的 bin 目录添加到用户环境变量 path 中来解决,添加环境变量之后重启管理员 PowerShell,默认的 CMake 安装目录如下:

    C:\Program Files\CMake\bin  

接下来脚本会自动 clone OpenCV 和 OpenCV contrib 库到本地,需要的时间相对长一点,这时候可以去干点别的 ...

由于网络原因可能导致自动脚本运行错误
那么我们可以手动 clone OpenCV 和 OpenCV contrib 库到 C:\opencv 目录,分别 checkout 到 :

*OpenCV:git checkout 6ffc48769a

*OpenCV contrib: git checkout ced5aa7606

然后根据编译方法使用 MinGW 还是 Visual Studio 的不同修改脚本 \.windows\mingw_build_OCV.ps1msvc_2_build_OCV.ps1 的内容。这里的编译工具是 Visual Studio,所以修改文件 \.windows\msvc_2_build_OCV.ps1 中的内容,注释第 62 行

    #git submodule update --init --recursive  

运行命令

    PowerShell -NoExit -File (.\.windows\msvc_2_build_OCV.ps1 -EnableCuda $False -Compiler vc15)  

如果中间没有错误且自动退出了 PowerShell,仔细检查是否在目录 C:\opencv\artifacts\vc15\build\opencv 生成了 OpenCV 的 Visual Studio 的工程。

如果有,那么使用 Visual Studio 打开解决方案文件 OpenCV.sln,完成编译和安装。

安装好 OpenCV 之后,开始进入 rust 的部分

rust-cv 程序的写法非常类似于 C++下的 OpenCV 写法

这里简单介绍读取一张图片并显示的流程:

按照 C++中写法的思路,我们给出图像存储的路径,把文件载入到 Mat 对象中,使用 highgui 下的创建窗口方法新建一个空窗口,使用 imShow 函数渲染图片。
思路有了,在 rust 下的示例代码如下:

    extern crate cv;  
    use cv::highgui::*;  
    use cv::imgcodecs::ImageReadMode;  
    use cv::*;  

    fn main() {  

        let img_path = "D:\\Temp\\1.jpg";  
        let mat = Mat::from_path(&img;_path, ImageReadMode::Color).expect("Failed to read from path");  

        if !mat.is_valid() {  
            println!("Could not open or find the image");  
            std::process::exit(-1);  
        }  

        highgui_named_window("Display window", WindowFlag::Normal).unwrap();  
        mat.show("Display window", 0).unwrap();  
    }  

由于是 Windows 下开发,文件的路径使用了双 \ 写法

运行效果如下:

【每周一库】 rust-cv - Rust 下的 OpenCV binding

本期的每周一库就到这里,希望可以帮到大家

来源链接:mp.weixin.qq.com