MCPcopy Create free account
hub / github.com/RustCV/RustCV / imshow

Function imshow

rustcv/src/highgui/mod.rs:24–82  ·  view source on GitHub ↗

在指定窗口中显示图像

(winname: &str, mat: &Mat)

Source from the content-addressed store, hash-verified

22
23/// 在指定窗口中显示图像
24pub fn imshow(winname: &str, mat: &Mat) -> Result<()> {
25 // 1. 格式转换
26 let buffer = mat_to_u32_buffer(mat)?;
27 let width = mat.cols as usize;
28 let height = mat.rows as usize;
29
30 // 2. 获取全局锁
31 let mut manager = WINDOW_MANAGER
32 .lock()
33 .map_err(|_| anyhow!("Failed to lock window manager"))?;
34
35 // 3. 检查是否需要重建窗口
36 let need_recreate = if let Some(wrapper) = manager.get(winname) {
37 // 获取当前窗口的尺寸
38 let (win_w, win_h) = wrapper.0.get_size();
39 // 如果尺寸不匹配(说明分辨率变了),标记为需要重建
40 // 注意:这里容忍一点点误差,或者严格匹配
41 win_w != width || win_h != height
42 } else {
43 true // 窗口不存在,肯定要创建
44 };
45
46 if need_recreate {
47 // 如果存在旧窗口,先移除(Drop 会自动关闭窗口)
48 if manager.contains_key(winname) {
49 manager.remove(winname);
50 }
51
52 // 创建新窗口
53 let mut window = Window::new(
54 winname,
55 width,
56 height,
57 WindowOptions {
58 resize: true, // 允许用户手动缩放
59 ..WindowOptions::default()
60 },
61 )
62 .map_err(|e| anyhow!("Failed to create window: {}", e))?;
63
64 // 初始更新
65 window
66 .update_with_buffer(&buffer, width, height)
67 .map_err(|e| anyhow!("Initial update failed: {}", e))?;
68
69 // 存入管理器
70 manager.insert(winname.to_string(), SendWindow(window));
71 } else {
72 // 窗口已存在且尺寸匹配,直接更新
73 if let Some(wrapper) = manager.get_mut(winname) {
74 wrapper
75 .0
76 .update_with_buffer(&buffer, width, height)
77 .map_err(|e| anyhow!("Window update failed: {}", e))?;
78 }
79 }
80
81 Ok(())

Callers 1

mainFunction · 0.85

Calls 2

mat_to_u32_bufferFunction · 0.85
SendWindowClass · 0.85

Tested by

no test coverage detected