2024-12-07 01:59:04 +08:00
|
|
|
extern crate rscam;
|
2024-12-07 11:03:24 +08:00
|
|
|
use std::{env, time::Instant};
|
2024-12-07 10:01:17 +08:00
|
|
|
|
2024-12-07 01:59:04 +08:00
|
|
|
use fltk::{
|
|
|
|
app::App,
|
|
|
|
enums::ColorDepth,
|
|
|
|
frame::Frame,
|
2024-12-07 09:55:09 +08:00
|
|
|
image::RgbImage,
|
2024-12-07 01:59:04 +08:00
|
|
|
prelude::{GroupExt, WidgetBase, WidgetExt},
|
|
|
|
window::Window,
|
|
|
|
};
|
|
|
|
use rscam::{Camera, Config};
|
|
|
|
|
2024-12-07 02:28:48 +08:00
|
|
|
fn main() {
|
2024-12-07 11:03:24 +08:00
|
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
println!("{:?}", args);
|
|
|
|
let camera_device = &args[1];
|
|
|
|
let w = args[2].clone();
|
|
|
|
let h = args[3].clone();
|
|
|
|
let fps = args[4].clone();
|
2024-12-07 02:28:48 +08:00
|
|
|
let mut camera_open = false;
|
2024-12-07 01:59:04 +08:00
|
|
|
let app = App::default();
|
2024-12-07 10:50:29 +08:00
|
|
|
let mut camera_window = Window::new(100, 100, 400, 300, "Camera Video Output Window");
|
|
|
|
let mut camera_frame = Frame::default_fill();
|
|
|
|
camera_window.end();
|
|
|
|
camera_window.show();
|
|
|
|
let mut color_window = Window::new(100, 600, 400, 300, "Video Output Window");
|
|
|
|
let mut color_frame = Frame::default_fill();
|
|
|
|
color_window.end();
|
|
|
|
color_window.show();
|
2024-12-07 01:59:04 +08:00
|
|
|
// app.run().unwrap();
|
|
|
|
// 打开摄像头设备
|
2024-12-07 11:03:24 +08:00
|
|
|
let mut camera = Camera::new(camera_device).unwrap();
|
2024-12-07 01:59:04 +08:00
|
|
|
|
|
|
|
// 配置摄像头参数
|
2024-12-07 02:28:48 +08:00
|
|
|
match camera.start(&Config {
|
2024-12-07 02:31:59 +08:00
|
|
|
// use command 'v4l2-ctl --list-formats-ext' see more...
|
2024-12-07 11:03:24 +08:00
|
|
|
interval: (1, parse(fps)), // 设置帧率为 30fps
|
|
|
|
resolution: (parse(w), parse(h)), // 设置分辨率为 640x480
|
|
|
|
format: b"MJPG", // 设置图像格式为 MJPG
|
2024-12-07 02:28:48 +08:00
|
|
|
..Default::default()
|
|
|
|
}) {
|
|
|
|
Ok(_) => camera_open = true,
|
|
|
|
Err(e) => {
|
|
|
|
eprint!("Open Camera Error:{}", e)
|
|
|
|
}
|
|
|
|
}
|
2024-12-07 09:55:09 +08:00
|
|
|
let mut w = 0 as i32;
|
|
|
|
let mut h = 0 as i32;
|
2024-12-07 02:28:48 +08:00
|
|
|
if camera_open {
|
|
|
|
loop {
|
|
|
|
// 捕获一帧图像
|
|
|
|
match camera.capture() {
|
|
|
|
Ok(data) => {
|
2024-12-07 10:01:17 +08:00
|
|
|
let start = Instant::now();
|
2024-12-07 02:28:48 +08:00
|
|
|
let img = image::load_from_memory(&data).unwrap();
|
2024-12-07 10:50:29 +08:00
|
|
|
let l_data = img.to_luma8();
|
|
|
|
let rgb_data = img.to_rgb8();
|
2024-12-07 09:55:09 +08:00
|
|
|
if w == 0 {
|
2024-12-07 10:50:29 +08:00
|
|
|
w = l_data.width() as i32;
|
|
|
|
h = l_data.height() as i32;
|
2024-12-07 09:55:09 +08:00
|
|
|
}
|
2024-12-07 10:50:29 +08:00
|
|
|
let fltk_l_image =
|
|
|
|
RgbImage::new(&l_data.as_raw(), w, h, ColorDepth::L8).unwrap();
|
|
|
|
let fltk_rgb_image =
|
|
|
|
RgbImage::new(&rgb_data.as_raw(), w, h, ColorDepth::Rgb8).unwrap();
|
|
|
|
camera_frame.set_image(Some(fltk_l_image));
|
|
|
|
color_frame.set_image(Some(fltk_rgb_image));
|
|
|
|
camera_frame.redraw();
|
|
|
|
color_frame.redraw();
|
2024-12-07 10:01:17 +08:00
|
|
|
let duration = start.elapsed();
|
|
|
|
println!("Time elapsed in DrawImage is: {:?}", duration);
|
2024-12-07 02:28:48 +08:00
|
|
|
}
|
|
|
|
Err(e) => {
|
|
|
|
eprintln!("捕获错误: {}", e);
|
|
|
|
continue;
|
|
|
|
}
|
2024-12-07 01:59:04 +08:00
|
|
|
}
|
2024-12-07 02:28:48 +08:00
|
|
|
app.wait();
|
2024-12-07 01:59:04 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-12-07 11:03:24 +08:00
|
|
|
|
|
|
|
/// 从 args 传入的数字转换为 u32
|
|
|
|
fn parse(str: String) -> u32 {
|
|
|
|
match str.parse::<u32>() {
|
|
|
|
Ok(data) => return data,
|
|
|
|
Err(e) => {
|
|
|
|
eprintln!("Error:${}", e);
|
2024-12-07 11:04:41 +08:00
|
|
|
println!("Note: rust-v4l2 <video_device> <width> <height> <interval>");
|
2024-12-07 11:03:24 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|