Compare commits

...

2 Commits

Author SHA1 Message Date
conglinyizhi 06709c9fa5 feat(main): 使用 `crossbeam` 库优化图像处理流程,提升性能 2024-12-07 13:11:46 +08:00
conglinyizhi 16fdb77ee7 🎨 style(main): 简化变量声明 2024-12-07 12:19:32 +08:00
3 changed files with 52 additions and 18 deletions

24
Cargo.lock generated
View File

@ -183,6 +183,19 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "crossbeam"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-epoch",
"crossbeam-queue",
"crossbeam-utils",
]
[[package]] [[package]]
name = "crossbeam-channel" name = "crossbeam-channel"
version = "0.5.13" version = "0.5.13"
@ -211,6 +224,15 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "crossbeam-queue"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
dependencies = [
"crossbeam-utils",
]
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.20" version = "0.8.20"
@ -772,6 +794,8 @@ dependencies = [
name = "rust_v4l2" name = "rust_v4l2"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"crossbeam",
"crossbeam-channel",
"fltk", "fltk",
"image", "image",
"rscam", "rscam",

View File

@ -4,6 +4,8 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
crossbeam = "0.8.4"
crossbeam-channel = "0.5.13"
fltk = "1.4.36" fltk = "1.4.36"
image = "0.25.5" image = "0.25.5"
rscam = "0.5.5" rscam = "0.5.5"

View File

@ -46,8 +46,8 @@ fn main() {
eprint!("Open Camera Error:{}", e) eprint!("Open Camera Error:{}", e)
} }
} }
let mut w = 0 as i32; let mut w = 0;
let mut h = 0 as i32; let mut h = 0;
if camera_open { if camera_open {
loop { loop {
// 捕获一帧图像 // 捕获一帧图像
@ -61,23 +61,31 @@ fn main() {
w = l_data.width() as i32; w = l_data.width() as i32;
h = l_data.height() as i32; h = l_data.height() as i32;
} }
for tmp_x in 0..30 { crossbeam::scope(|_| {
for tmp_y in 0..60 { for tmp_x in 0..30 {
rgb_data.put_pixel(tmp_x, tmp_y, Rgb([102, 204, 255])); for tmp_y in 0..60 {
rgb_data.put_pixel(tmp_x, tmp_y, Rgb([102, 204, 255]));
}
} }
} let fltk_rgb_image =
let fltk_l_image = RgbImage::new(rgb_data.as_raw(), w, h, ColorDepth::Rgb8).unwrap();
RgbImage::new(l_data.as_raw(), w, h, ColorDepth::L8).unwrap(); color_frame.set_image(Some(fltk_rgb_image));
let fltk_rgb_image = color_frame.set_size(w, h);
RgbImage::new(rgb_data.as_raw(), w, h, ColorDepth::Rgb8).unwrap(); color_frame.redraw();
camera_frame.set_image(Some(fltk_l_image)); let duration = start.elapsed();
color_frame.set_image(Some(fltk_rgb_image)); println!("L8 Frame Draw use time: {:?}", duration);
// 通过重新调整尺寸从而刷新图像 })
color_frame.set_size(w, h); .unwrap();
camera_frame.redraw(); crossbeam::scope(|_| {
color_frame.redraw(); let fltk_l_image =
let duration = start.elapsed(); RgbImage::new(l_data.as_raw(), w, h, ColorDepth::L8).unwrap();
println!("Time elapsed in DrawImage is: {:?}", duration); camera_frame.set_image(Some(fltk_l_image));
// 通过重新调整尺寸从而刷新图像
camera_frame.redraw();
let duration = start.elapsed();
println!("RGB8 Frame Draw use time: {:?}", duration);
})
.unwrap();
} }
Err(e) => { Err(e) => {
eprintln!("捕获错误: {}", e); eprintln!("捕获错误: {}", e);