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

2020-02-26 16:40:16 浏览数 (1)

本期的每周一库给大家带来的是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_PATHinstallincludeopencv2
  • OPENCV_PACKAGE_NAME: opencv
  • OPENCV_PYTHON3_BIN: PYTHON3_PATHpython.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_PATHinstallx64vc15lib
  • OPENCV_INCLUDE_PATHS: BUILD_FOLDER_PATHinstallincludeopencv2

但是,在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,运行下面的命令

代码语言:javascript复制
PowerShell -NoExit -File (..windowsmsvc_2_build_OCV.ps1 -EnableCuda $False -Compiler vc15)

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

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

代码语言:javascript复制
set-executionpolicy remotesigned

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

代码语言:javascript复制
C:Program FilesCMakebin

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

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

  • OpenCV:git checkout 6ffc48769a
  • OpenCV contrib: git checkout ced5aa7606

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

代码语言:javascript复制
#git submodule update --init --recursive

运行命令

代码语言:javascript复制
PowerShell -NoExit -File (..windowsmsvc_2_build_OCV.ps1 -EnableCuda $False -Compiler vc15)

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

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

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

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

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

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

代码语言:javascript复制
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下开发,文件的路径使用了双写法

运行效果如下:

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

0 人点赞