use anyhow::bail;
use image::{ExtendedColorType, ImageFormat};
use opencv::{
core::{Mat, MatTraitConst, MatTraitConstManual},
imgproc::{cvt_color_def, COLOR_BGR2RGB},
videoio::{self, VideoCaptureTrait, VideoCaptureTraitConst, CAP_ANY},
};
fn main() -> anyhow::Result<()> {
let mut video_capture = videoio::VideoCapture::new_def(CAP_ANY)?;
if !video_capture.is_opened()? {
bail!("Failed to open camera.")
}
loop {
let mut frame = Mat::default();
video_capture.read(&mut frame)?;
let frame_size = frame.size()?;
let mut corrected_frame = Mat::default();
cvt_color_def(&frame, &mut corrected_frame, COLOR_BGR2RGB)?;
image::save_buffer_with_format(
"image.bmp",
corrected_frame.data_bytes()?,
frame_size.width as u32,
frame_size.height as u32,
ExtendedColorType::Rgb8,
ImageFormat::Bmp,
)?;
}
}
#[cfg(test)]
mod test {
use wincam::Webcam;
#[test]
#[serial_test::serial]
fn create_instance() {
let webcam = Webcam::new_def_auto_detect();
assert!(webcam.is_ok())
}
#[test]
#[serial_test::serial]
fn read_image_bytes() {
let mut webcam = Webcam::new_def_auto_detect().unwrap();
let (bytes, size) = webcam.get_frame().unwrap();
assert_eq!(bytes.len() as i32, size.area() * 3)
}
}