直接在 Cargo.toml
中添加以下依赖:
[dependencies]
opencv = "0.76.4"
代码:
use opencv::{
core::Scalar, highgui, imgproc, objdetect, prelude::*, types, videoio,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut camera = videoio::VideoCapture::new(0, videoio::CAP_ANY)?;
let mut img = Mat::default();
let mut qr_dector = objdetect::QRCodeDetector::default()?;
let mut res = types::VectorOfPoint::new();
let mut recqr_img = Mat::default();
loop {
camera.read(&mut img)?;
// 二维码数据
let ret = qr_dector.detect_and_decode(&img, &mut res, &mut recqr_img)?;
// 把二维码数据转成字符串
let s = String::from_utf8_lossy(&ret);
println!("二维码数据: {:?}", s);
highgui::named_window("QR Code", highgui::WINDOW_NORMAL)?;
if recqr_img.size()?.width > 0 {
// 显示出二维码到窗口上
highgui::imshow("QR Code", &recqr_img)?;
}
if res.len() > 0 {
// 框选需要扫描的二维码
imgproc::polylines(
&mut img,
&res,
true,
Scalar::new(255f64, 0f64, 0f64, 0f64),
1,
1,
0,
)?;
}
highgui::imshow("Frame", &img)?;
let key = highgui::wait_key(1)?;
// 按 Esc 键盘退出
if key == 27 {
break;
}
}
Ok(())
}