2.2.3 C#中显示控件BDPictureBox 的实现----控件实现

2.2.3 C#中显示控件BDPictureBox 的实现----控件实现

1 界面控件布局

显示控件布局

2图片内存Mat类说明

  1. 原始图片:m_raw_mat ,Display_Mat()调用时更新或者InitDisplay_Mat时更新
  2. 局部放大显示图片:m_extract_zoom_mat,更新scale和scroll信息后更新
  3. overlay图片 m_extract_overlay_mat , 显示曲线和文本信息
  4. 最终呈现图片:m_extract_zoom_dispaly
    图片内存图片关系

3 正常图片刷新流程举例

视觉检测应用时,为了减少图片刷新次数, 一般只会在最后更新一下图片内存到显示区域,以提高速度,需要用到一个bool类型标志位 b_flush_display
flush 图片内存流程

4 滚动条事件代码

/// <summary>
/// hScr0_Scroll
/// remark: 滚动条 hsrco事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void hScr0_Scroll(object sender, EventArgs e)
{double t_gap = DateTime.Now.Subtract(_last_pan).TotalMilliseconds;if (t_gap < 10) return;if (!BD_Window_State_Judge()) return;bd_window_state = BDDISPLAY_STATE.zoom_display;
if (BD_OperateSet.MatisNotNull(m_raw_mat))
{// 计算公式,就是 计算当前 scroll中心相对 scroll原始中心偏移值,然后 修正 画布的放大系数DispManager.get_DispCTX().update_Scroll_Info_after_scroll();OpenCvSharp.Point offset = DispManager.get_DispCTX().getoffset();label_img_info.Text = " X:" + offset.X.ToString("0.0") + " Y:" + offset.Y.ToString("0.0");b_flush_display = false;update_ExtractRGB_and_NewOverlay();b_flush_display = true;Disp_Point_Internal(0, 0, new Scalar(0, 0, 0), 1);b_flush_display = true;
}
bd_window_state = BDDISPLAY_STATE.idle;
_last_pan = DateTime.Now;
}

5 按钮button Zoom事件

/// <summary>
/// btn_zoom_Click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_zoom_Click(object sender, EventArgs e)
{if (!BD_Window_State_Judge()) return;bd_window_state = BDDISPLAY_STATE.zoom_display;try{if (BD_OperateSet.MatisNotNull(m_raw_mat)){DispManager.get_DispCTX().enlarge(1.1f);OpenCvSharp.Point offset = DispManager.get_DispCTX().getoffset();b_flush_display = false;label_img_info.Text = " X:" + offset.X.ToString("0.0") + " Y:"+offset.Y.ToString("0.0");update_ExtractRGB_and_NewOverlay();b_flush_display = true;Disp_Point_Internal(0, 0, new Scalar(0, 0, 0), 1);b_flush_display = false;}}catch (Exception ex){label_img_info.Text = "Zoom:" + ex.Message;}bd_window_state = BDDISPLAY_STATE.idle;
}

6 更新局部图片函数代码update_ExtractRGB_and_NewOverlay

 /// <summary>
/// update_ExtractRGB_and_NewOverlay   用于 scale系数变化时用, overlay会清零
/// </summary>
public void update_ExtractRGB_and_NewOverlay()
{ if (!BD_OperateSet.MatisNotNull(m_raw_mat)) return;Mat m_extract_mat_copy = new Mat();try{int nRet = DispManager.get_DispCTX().update_display_img(m_raw_mat,ref  hom2d_quick, ref m_extract_zoom_mat); if (nRet != 0) return;#region  // 增加显示 多种图片类型 MatType img_type = m_raw_mat.Type();double minVal, maxVal;double scale, add;//step3  m_extract_zoom_dispalywidth_extract_zoom = m_extract_zoom_mat.Width;height_extract_zoom = m_extract_zoom_mat.Height;BD_OperateSet.Assign_Temp(ref m_extract_zoom_overlay, Mat.Zeros(m_extract_zoom_mat.Size(), MatType.CV_8UC3));       switch (img_type.Value){case 0: // CV_8UC1 lock (_object_display){BD_OperateSet.Assign_Temp(ref m_extract_zoom_dispaly, new Mat());Cv2.CvtColor(m_extract_zoom_mat, m_extract_zoom_dispaly, ColorConversionCodes.GRAY2BGR);}break;case 1:break;case 2:// CV_16UC1 case 3://CV_16US1 Cv2.MinMaxIdx(m_raw_mat, out minVal, out maxVal);if ((maxVal - minVal) != 0)scale = (255.0) / (maxVal - minVal);else scale = 1;add = -minVal * scale;lock (_object_display){m_extract_zoom_mat.ConvertTo(m_extract_zoom_mat, MatType.CV_8UC1, scale, add);BD_OperateSet.Assign_Temp(ref m_extract_zoom_dispaly, new Mat());Cv2.CvtColor(m_extract_zoom_mat, m_extract_zoom_dispaly, ColorConversionCodes.GRAY2BGR); }break;case 5:// CV_32FC1  break;case 6:// CV_64FC1 break;case 16: // CV_8UC3  lock (_object_display){ // 销毁内存BD_OperateSet.Assign_Temp(ref m_extract_zoom_dispaly, m_extract_zoom_mat.Clone());}break;case 21: // CV_64FC3  break;default:// 默认显示黑色图片 lock (_object_display){ // 销毁内存BD_OperateSet.Assign_Temp(ref m_extract_zoom_dispaly, new Mat());Cv2.CvtColor(m_extract_zoom_mat, m_extract_zoom_dispaly, ColorConversionCodes.GRAY2BGR); }break;} #endregion}catch (Exception ex){label_img_info.Text = "Update Quick ROI&Img:" + ex.Message;}
}

7 图片显示Display_Mat

public void Display_Mat(ref Mat m_inputimg)
{if (!BD_Window_State_Judge()) return;bd_window_state = BDDISPLAY_STATE.display_mat;try{if (BD_OperateSet.MatisNotNull(m_inputimg)){// 如果 原来图像尺寸和 input尺寸有所变化,需要调用InitDisplay()if(DispManager.get_DispCTX().NeedInitDisplay(m_inputimg.Size(),new OpenCvSharp.Size(pB_Display.Width,pB_Display.Height))){InitDisplay_Mat_Interanl(ref m_inputimg); bd_window_state = BDDISPLAY_STATE.idle; return;} // m_raw_mat = m_inputimg;BD_OperateSet.Assign_Mat(ref m_raw_mat, ref m_inputimg);//n_DisplayMode = 0; if (b_flush_display){update_extract_RGB_And_Overlays();pB_Display.Invalidate();}label_img_info.Text = "Image info:"; }else{}}catch (Exception ex){label_img_info.Text = "Disp Img:" + ex.Message;}bd_window_state = BDDISPLAY_STATE.idle;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年精选100道软件测试面试题(内含文档)

测试技术面试题 1、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 2、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用…

市场规模5万亿,护理员缺口550万,商业护理企业如何解决服务供给难题?

干货抢先看 1. 据统计&#xff0c;我国失能、半失能老人数量约4400万&#xff0c;商业护理服务市场规模达5万亿。然而&#xff0c;当前养老护理员缺口巨大&#xff0c;人员的供需不匹配是很多养老服务企业需要克服的难题。 2. 当前居家护理服务的主要市场参与者分为两类&…

利用GPT 将 matlab 内置 bwlookup 函数转C

最近业务需要将 matlab中bwlookup 的转C 这个函数没有现成的m文件参考&#xff0c;内置已经打成库了&#xff0c;所以没有参考源代码 但是它的解释还是很清楚的&#xff0c;可以根据这个来写 Nonlinear filtering using lookup tables - MATLAB bwlookup - MathWorks 中国 A…

python请求报错::requests.exceptions.ProxyError: HTTPSConnectionPool

在发送网页请求时&#xff0c;发现很久未响应&#xff0c;最后报错&#xff1a; requests.exceptions.ProxyError: HTTPSConnectionPool(hostsvr-6-9009.share.51env.net, port443): Max retries exceeded with url: /prod-api/getInfo (Caused by ProxyError(Unable to conne…

秒懂设计模式--学习笔记(5)【创建篇-抽象工厂】

目录 4、抽象工厂4.1 介绍4.2 品牌与系列&#xff08;针对工厂泛滥&#xff09;(**分类**)4.3 产品规划&#xff08;**数据模型**&#xff09;4.4 生产线规划&#xff08;**工厂类**&#xff09;4.5 分而治之4.6 抽象工厂模式的各角色定义如下4.7 基于此抽象工厂模式以品牌与系…

vue启动时的错误

解决办法一&#xff1a;在vue.config.js中直接添加一行代码 lintOnSave:false 关闭该项目重新运行就可启动 解决办法二&#xff1a; 修改组件名称

配音软件有哪些?分享五款超级好用的配音软件

随着嫦娥六号的壮丽回归&#xff0c;举国上下都沉浸在这份自豪与激动之中。 在这样一个历史性的时刻&#xff0c;我们何不用声音记录下这份情感&#xff0c;让这份记忆以声音的形式流传&#xff1f; 无论是制作视频分享这份喜悦&#xff0c;还是创作音频讲述探月故事&#xff…

Oracle数据库中RETURNING子句

RETURNING子句允许您检索插入、删除或更新所修改的列&#xff08;以及基于列的表达式&#xff09;的值。如果不使用RETURNING&#xff0c;则必须在DML语句完成后运行SELECT语句&#xff0c;才能获得更改列的值。因此&#xff0c;RETURNING有助于避免再次往返数据库&#xff0c;…

CXL-GPU: 全球首款实现百ns以内的低延迟CXL解决方案

数据中心在追求更高性能和更低总拥有成本&#xff08;TCO&#xff09;的过程中面临三大主要内存挑战。首先&#xff0c;当前服务器内存层次结构存在局限性。直接连接的DRAM与固态硬盘&#xff08;SSD&#xff09;存储之间存在三个数量级的延迟差异。当处理器直接连接的内存容量…

VideoPrism——探索视频分析领域模型的算法与应用

概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口&#xff0c;记录了从日常瞬间到科学探索的各种体验。在这个数字时代&#xff0c;视频基础模型&#xff08;ViFM&#xff09;有可能分析如此海量的信息并提取新的见解。迄今为止&#xff0c;…

采煤机作业3D虚拟仿真教学线上展示增强应急培训效果

在化工行业的生产现场&#xff0c;安全永远是首要之务。为了加强从业人员的应急响应能力和危机管理能力&#xff0c;纷纷引入化工行业工艺VR模拟培训&#xff0c;让应急演练更加生动、高效。 化工行业工艺VR模拟培训软件基于真实的厂区环境&#xff0c;精确还原了各类事件场景和…

医疗器械FDA | 医疗器械软件如何做源代码审计?

医疗器械网络安全测试https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e 医疗器械源代码审计是一个确保医疗器械软件安全性和可靠性的重要过程。以下是医疗器械源代码审计的主要步骤和要点&#xff0c;以…

Vue3 sortablejs 表格拖拽后,表格无法更新的问题处理

实用sortablejs在vue项目中实现表格行拖拽排序 你可能会发现&#xff0c;表格排序是可以实现&#xff0c;但是我们基于数据驱动的vue中关联的数据并没有发生变化&#xff0c; 如果你的表格带有列固定(固定列实际上在dom中有两个表格&#xff0c;其中固定的列在一个表格中&…

游泳哪个牌子好?6大游泳耳机选购技巧总结分享

游泳耳机作为水上运动爱好者和游泳专业人士的必备装备&#xff0c;不仅要能够抵御水的侵入&#xff0c;还要提供清晰的音质和舒适的佩戴体验。在市面上&#xff0c;不同品牌的游泳耳机琳琅满目&#xff0c;选择起来可能会令人头疼。本文旨在为您提供一份详尽的游泳耳机选购指南…

Gemma轻量级开放模型在个人PC上释放强大性能,让每个桌面秒变AI工作站

Google DeepMind团队最近推出了Gemma&#xff0c;这是一个基于其先前Gemini模型研究和技术的开放模型家族。这些模型专为语言理解、推理和安全性而设计&#xff0c;具有轻量级和高性能的特点。 Gemma 7B模型在不同能力领域的语言理解和生成性能&#xff0c;与同样规模的开放模型…

名企专访|对抗价格内卷,格行随身WiFi如何持续三年爆火引领潮流

近期要是问网红达人最喜欢带货的单品是什么&#xff1f;那一定有格行随身WiFi的一席之地。能聚集了如此多的明星达人&#xff0c;仅仅是一句带货收益高显然无法说服大家。显然这里面还有着不为人知的秘密&#xff0c;先锋财经特意专访了格行随身WiFi的创始人刘永先先生&#xf…

8.x86游戏实战-OD详解

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;7.x86游戏实战-C实现跨进程读写-跨进程写内存 工具下载&#xff1a;下载 OllyI…

嵌入式Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

[我靠升级逆袭成为大师]韩漫日漫无删减完整版,免费在线观看漫画

[我靠升级逆袭成为大师]韩漫日漫无删减完整版&#xff0c;免费在线观看漫画 不能多说&#xff0c;怕审-核不过&#xff0c;自己看图吧。 目前统计【统计日期&#xff1a;2024-07-03】&#xff1a; 完结的有&#xff1a;420部。 连载的有&#xff1a;308部&#xff0c;持续更…

python库(1):Nuitka库

1 Nuitka介绍 Nuitka是一个 Python 解释器的替代品&#xff0c;支持CPython提供的代码&#xff0c;可编译 Python 代码到 C 程序&#xff0c;并使用 libpython 来执行这些代码&#xff0c;就像 CPython 一样。 这让你可以在没有安装 Python 的环境中运行 Python 程序&#xf…