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、正交表测试用…

Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章

Eureka与Spring Cloud Bus的协同&#xff1a;打造智能服务发现新篇章 在微服务架构中&#xff0c;服务发现是实现服务间通信的关键机制。Eureka作为Netflix开源的服务发现框架&#xff0c;与Spring Cloud Bus的集成&#xff0c;提供了一种动态、响应式的服务治理解决方案。本文…

市场规模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; 修改组件名称

Python容器 之 通用功能

1.切片 1.格式&#xff1a; 数据[起始索引:结束索引:步长 2.适用类型&#xff1a; 字符串(str)、列表(list)、元组(tuple) 3.说明&#xff1a; 通过切片操作, 可以获取数据中指定部分的内容 4.注意 : 结束索引对应的数据不会被截取到 支持正向索引和逆向索引 步长用于设置截取…

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

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

Oracle数据库中RETURNING子句

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

Plotly:原理、使用与数据可视化的未来

文章目录 引言Plotly的原理Plotly的基本使用安装Plotly创建基本图表定制图表样式 Plotly的高级特性交互式图表图表动画图表集成 结论 引言 在当今的数据驱动世界中&#xff0c;数据可视化已经成为了一个至关重要的工具。它允许我们直观地理解数据&#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;…

【vuejs】vue-router 路由跳转参数传递详解和应用场景及技巧

1. Vue2 Router 路由基础 1.1 路由定义 路由定义是Vue Router中实现页面路由跳转的基础。在Vue2中&#xff0c;路由的定义通常在应用的入口文件或路由配置文件中进行。路由定义涉及到路径模式&#xff08;path&#xff09;、视图组件&#xff08;component&#xff09;以及一…

【数据分析思维--史上最全最牛逼】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;主要和大家分享一下数据分析的思维&#xff01;怎么提好我们对于业务的判断是非常重要的&#xff01;&#xff01;&#xff01;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代码是你…

采煤机作业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;其中固定的列在一个表格中&…

【Python】优雅的快速选择 - 快速排序 - 随机快速排序

快速选择&#xff08;递归实现版&#xff09; 这里给出以 “leetcode215. 数组中的第K个最大元素”为例的代码。 class Solution:def findKthLargest(self, nums, k):self.nums numsn len(nums)return self.quickSelect(0,n-1,n-k)def quickSelect(self,l,r,k): # 手撸快速…

Vue3实战笔记(64)—Vue 3自定义指令的艺术:实战中的最佳实践

文章目录 前言一、一些简单的Vue3自定义指令超实用案例总结 前言 书接上文&#xff0c;在Vue3中&#xff0c;自定义指令是一种强大的工具&#xff0c;允许我们扩展HTML元素的功能。通过自定义指令&#xff0c;我们可以创建可重用的行为&#xff0c;并将它们绑定到任何元素上。…