//! Scan for a barcode or QR code from the default camera. use std::{ io::Cursor, time::{Duration, SystemTime}, }; use keyfork_zbar::{image::Image, image_scanner::ImageScanner}; use image::io::Reader as ImageReader; use v4l::{ buffer::Type, io::{traits::CaptureStream, userptr::Stream}, Device, }; fn main() -> Result<(), Box> { let device = Device::new(0)?; let mut stream = Stream::with_buffers(&device, Type::VideoCapture, 4)?; let start = SystemTime::now(); let mut scanner = ImageScanner::new(); while SystemTime::now() .duration_since(start) .unwrap_or(Duration::from_secs(0)) < Duration::from_secs(30) { let (buffer, _) = stream.next()?; let image = Image::from( ImageReader::new(Cursor::new(buffer)) .with_guessed_format()? .decode()?, ); if let Some(symbol) = scanner.scan_image(&image).first() { println!("{}", String::from_utf8_lossy(symbol.data())); return Ok(()); } } println!("Could not find a QR code"); Ok(()) }