Rust 通过 OpenCV 识别二维码

595 阅读1分钟

直接在 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(())
}