本期的每周一库给大家带来的是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,运行下面的命令
PowerShell -NoExit -File (..windowsmsvc_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 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.ps1
或msvc_2_build_OCV.ps1
的内容。这里的编译工具是Visual Studio,所以修改文件.windowsmsvc_2_build_OCV.ps1
中的内容,注释第62行
#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下的示例代码如下:
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下开发,文件的路径使用了双写法
运行效果如下:
本期的每周一库就到这里,希望可以帮到大家