windows10下rust使用opencv4库
opencv = "0.41.0"
首先这个库是对opencv的绑定,而opencv2.4版以后就不对C API进行维护了,虽然也是访问(但功能是都是以前的C API,新的方法功能都在C++文件中)。
rust的opencv库不是简单的绑定,FFI相关的内存处理,让你使用起来完全不用关心这些细节.
而且文档很好,可以很好的使用C++相关opencv的书籍例子.
对C++都放在cv这个命名空间进行了rust习惯的模块划分。
rust第三方库bindgen只能对C代码和部分的C++版代码进行生成(很坑,2和3的版都可以使用,可以参考我的另一篇文章https://blog.csdn.net/u013195275/article/details/106763844),作者使用这个项目
https://github.com/twistedfall/opencv-rust/tree/master/binding-generator对C++代码生成,有兴趣的可以看下。
本来准备使用opencv,肯定先到https://crates.io/crates/opencv 找到这个库,然后开始说坑。
首先作者推荐在windows下使用以下两种方式安装opencv库:
可能是我的环境变量,用这两个软件安装opencv依赖库,第一个llvm和opencv都安装不动(怀疑被墙),第二个LLVM安装不成功.opencv成功了(安装速度可以用整晚来形容)。
故放弃了。然后去翻了官方的问题列表,果然有解决方案,也是通用版本一种,觉得很适合中国人使用https://github.com/twistedfall/opencv-rust/issues/118。
截图:
这个教程的前提是,安装好LLVM和cmake,LLVM要配置好llvm-config.exe这个文件和环境变量。
cmake下最新本,安装配置好环境变量即可,LLVM也可以使用官方windows二进制版,然后配置好环境变量,llvm-config参考我这篇文章https://blog.csdn.net/u013195275/article/details/106871312,不想编译的可以下载我编译好的,但相关DLL得有才能使用。
上面配置好后,来安装opencv,其实windows下更简单,去官方下最新的opencv文件。https://opencv.org/releases/
点windows下载完成,我下了三个版本都测试了。
这里只以4.3的版本来说。解压opencv-4.3.0-vc14_vc15.exe。我解压到了F盘
,现在去配置三个环境变量:
Manual build
You can of course always compile OpenCV of the version you prefer manually. This is also supported, but it requires some additional configuration.
You need to set up the following environment variables to point to the installed files of your OpenCV build:
OPENCV_LINK_LIBS
,OPENCV_LINK_PATHS
andOPENCV_INCLUDE_PATHS
(see below for details).
OPENCV_LINK_LIBS
的值是指在lib的opencv_world463.lib文件。
下面去创建一个cargo工程:
Cargo.toml
[dependencies]
opencv = {version = "0.41", default-features = false, features = ["opencv-4","buildtime-bindgen"]}
因为我要测试2和3等其它版本,所以使用了default-features = false, features = ["opencv-4"]。
官方说明了在Windows和macOS上构建时,必须启用buildtime-bindgen功能以避免链接错误:
"buildtime-bindgen"特性我认为是根据opencv_worldXXX.lib重新定位编译链接到不同版本的dll。
代码,一个是上面那位大叔的摄像头例子:
use opencv::{
core,
highgui,
prelude::*,
videoio,
};
fn run() -> opencv::Result<()> {
let window = "video capture";
highgui::named_window(window, 1)?;
#[cfg(feature = "opencv-32")]
let mut cam = videoio::VideoCapture::new_default(0)?; // 0 is the default camera
#[cfg(not(feature = "opencv-32"))]
let mut cam = videoio::VideoCapture::new(0, videoio::CAP_ANY)?; // 0 is the default camera
let opened = videoio::VideoCapture::is_opened(&cam)?;
if !opened {
panic!("Unable to open default camera!");
}
loop {
let mut frame = core::Mat::default()?;
cam.read(&mut frame)?;
if frame.size()?.width > 0 {
highgui::imshow(window, &mut frame)?;
}
let key = highgui::wait_key(10)?;
if key > 0 && key != 255 {
break;
}
}
Ok(())
}
fn main() {
run().unwrap()
}
下面是我的例子,读一张照片显示出来:
use opencv::{
core,
highgui,
prelude::*,imgcodecs,imgproc,
videoio,
};
use opencv::imgcodecs::IMREAD_COLOR;
fn cv_demo() {
let window = "video capture1";
highgui::named_window(window, 1);
let mat = imgcodecs::imread("d:/u=3710180744,1467376657&fm=26&gp=0.jpg", IMREAD_COLOR);
mat.map(|m| {
highgui::imshow("rust", &m);
highgui::wait_key(0);
highgui::destroy_window("name");
});
}
fn main() {
cv_demo()
}
有问题留言,linux版本没有测试(其实这个库的坑就是相关opencv的dll或.so链接的问题)通过。