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_dispaly
        width_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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…

公路道路救援师傅入驻派单小程序开发

道路救援入驻与派单系统小程序开发——面向专业市场的解决方案。 在构建道路救援服务的数字化生态系统中&#xff0c;一款高效、用户友好的入驻与派单小程序显得尤为重要。该小程序旨在无缝连接救援服务师傅和需要道路救援的用户&#xff0c;通过一系列精心设计的功能模块&…

经典文献阅读之--WidthFormer(基于Transformer的BEV方案量产方案)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

“剪切走的文件救星:详解两大高效恢复策略“

深入剖析剪切走的文件 在日常的计算机操作中&#xff0c;剪切操作是文件管理的常用手段&#xff0c;但一旦操作不当或意外中断&#xff0c;文件就可能“剪切走”&#xff0c;消失在用户的视野中。这些文件并未真正从硬盘上消失&#xff0c;而是因为文件系统的索引被修改&#…

三菱A系列网络连接

寄存器名 读写 寄存器类型 变量类型 寄存器范围 说明 X##1 R/W BIT I/O离散 0&#xff0d;7FF Input Y##1 R/W BIT I/O离散 0&#xff0d;7FF Output M##1 R/W BIT I/O离散 0&#xff0d;9255 Internal relay B##1 R/W BIT I/O离散 0&#xff0d;3FF Link relay F##1 R/W BIT I…

vue为啥监听不了@scroll

哈喽 大家好 我在vue中写了一个滚动scroll监听事件 然后滚动鼠标 发现进不来我的方法断点 原因&#xff1a; 事件绑定错误&#xff1a;确保你使用scroll正确绑定到了可滚动容器上。 事件冒泡&#xff1a;滚动事件可能被封装在某些组件内部&#xff0c;导致不会冒泡到父元素上…

HarmonyOS ArkUi 官网踩坑:单独隐藏导航条无效

环境&#xff1a; 手机&#xff1a;Mate 60 Next版本&#xff1a; NEXT.0.0.26 导航条介绍 导航条官网设计指南 setSpecificSystemBarEnabled 设置实际效果&#xff1a; navigationIndicator&#xff1a;隐藏导航条无效status&#xff1a;会把导航条和状态栏都隐藏 官方…

【udp报文】udp报文未自动分片,报文过长被拦截问题定位

问题现象 某局点出现一个奇怪的现象&#xff0c;客户端给服务端发送消息&#xff0c;服务端仅能收到小部分消息&#xff0c;大部分消息从客户端发出后&#xff0c;服务端都未收到。 问题定位 初步分析 根据现象初步分析&#xff0c;有可能是网络原因导致消息到服务端不可达&a…

AVR晶体管测试仪开源制作与验证

AVR晶体管测试仪开源制作与验证 &#x1f4cd;原项目地址&#xff1a;https://www.mikrocontroller.net/articles/AVR_Transistortester github地址&#xff1a;https://github.com/Mikrocontroller-net/transistortester &#x1f388;EasyEDA项目地址&#xff1a;https://osh…

华三多台交换机堆叠配置(环形组网)

组网架构 配置步骤 SW1的配置&#xff1a; irf member 1 priority 32 设置master的优先级为32 interfacec range Ten-GigabitEthernet1/0/49 to Ten-GigabitEthernet1/0/50 shutdown 关闭上述接口&#xff08;将其加入到堆叠口之前需要关闭&#xff0c;否则无法加入&a…

性价比蓝牙耳机怎么选?百元高性价比蓝牙耳机推荐

在现代社会中&#xff0c;蓝牙耳机已经成为人们日常生活中必不可少的配件之一。对于许多消费者来说&#xff0c;找到一款高性价比且价格在百元左右的蓝牙耳机是非常重要的。市面上有许多价格不菲的蓝牙耳机&#xff0c;性价比蓝牙耳机怎么选&#xff1f;如何在有限预算下找到性…

数据结构 —— 二叉树

1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它有着多分支&#xff0c;层次性的特点。 由于其形态类似于自然界中倒过来的数&#xff0c;所以我们将这种数据结构称为“树形结构” 注意&#xff1a; 树形结构中&#xff0c;子树之间不能有交集&#x…

SwiftUI 中 Grid 内多个 NavigationLink 同时发生导航之诡异问题的解决

问题现象 不知小伙伴们发现了没有?在 SwiftUI 中如果有多个 NavigationLink 视图嵌入在 Grid(包括 LazyVGrid 和 LazyHGrid)容器中,点击其中任意一个 NavigationLink 都会导致所有导航一起发生。 如上图所示,点击 Grid 中任何一个 NavigationLink,所有 NavigationLink 都…

[数据结构] --- 树

1 树的基本概念 1.1 树的定义 树是n(n>0)个结点的有限集。当 n 0 时&#xff0c;称为空树。在任意一棵树非空树中应满足&#xff1a; (1) 有且仅有一个特定的称为根 (root) 的结点&#xff1b; (2) 当 n > 1 时&#xff0c;其余结点可分为m(m>0)个互不相交的有限集…

bootloader原理介绍

bootloader解析 bootloader的引出 不知道你有没有想过这样一个问题&#xff0c;当你按下电源开关的那一瞬间&#xff0c;第一行代码是如何在芯片上运行起来的呢&#xff1f;我们都知道嵌入式软件代码&#xff0c;是需要通过一定的方式&#xff0c;烧录在硬件芯片中&#xff0c…

【Zotero】【国标csl调教(七)】导入专著M、学位论文D以及百度学术的问题

一、百度学术 百度学术导入的字段&#xff08;期卷号、页码&#xff09;等会有严重错误&#xff0c;不建议通过Baidu Scholar导入&#xff0c; 建议在文库编目字段自行查找修改 二、专著【M】以及学位论文【D】的出版地问题 国标对硕博论文【D】和专著【M】要求写上出版地 …

OpenSSL的一些使用案例

目录 一、介绍 二、基本使用 1、Shell &#xff08;1&#xff09;文件加解密 &#xff08;2&#xff09;生成密钥文件 2、API &#xff08;1&#xff09;md5sum &#xff08;2&#xff09;AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法&#xff0c;只…

昇思第7天

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。 定义神经网络模型。 定义超参、损失函数及优化器。 输入数据集进行训练与评估。 数据集加载 import mindspore from mindspore import nn # 从 MindSpore 数据集包中导入 vision 和 transforms 模块。 # visio…

使用DC/AC电源模块时需要注意的事项

BOSHIDA 使用DC/AC电源模块时需要注意的事项 1. 仔细阅读和理解产品说明书&#xff1a;在使用DC/AC电源模块之前&#xff0c;应该仔细阅读和理解产品说明书&#xff0c;了解其性能特点、技术要求和使用方法&#xff0c;以确保正确使用和避免潜在的安全风险。 2. 选择适当的电…

MySQL 9.0 发布了!

从昨晚开始&#xff0c;在DBA群里大家就在讨论MySQL 9.0发布的事情&#xff0c;但是Release Note和官方文档都没有更新&#xff0c;所以今天早上一上班就赶紧瞅了下具体更新了哪些内容&#xff1f; 整体看来&#xff0c;基本没什么创新。下面是9.0新增或废弃的一些特性。 &…