2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

news2024/12/25 12:38:14

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

1 界面效果

在设定模式下,可以进行ROI 框的拖动,这里以Rect1举例说明
ROI 交互

2 增加ROI类定义

 /// <summary>
/// ROI_single
/// 用于描述图片感兴趣区域
/// type: 0:Rect1;1:Rect2;2:Circle ;3:Ellipse;4:Arc;5:Polygen;6:Point;7:line;
/// </summary>
public class ROI_single
{   //   Rect1 = 0,
    //    Rect2 = 1,
    //    Circle = 2,
    //    Ellipse = 3,
    //    Arc = 4,
    //    Polygen = 5,
    //    Point = 6,
    //    Line = 7 
    public int m_nType;
     // 参考labview  ROIdiscriptor
    public List<float> m_fDatas;
}

3 ROI生命周期示意图

ROI生命周期示意图

4 Button_Rect1 事件

创建或者显示ROI—Rect1矩形
btn_rect1

if (m_raw_mat != null)
{    // 更新原始图片数据
      Clear_Overlay_Internal();
      if (m_ROIs[m_ROI_index].m_nType != 0 || m_ROIs[m_ROI_index].m_fDatas.Count == 0)
      {
          // 如果主ROI 重画 ,Mask全部清空
          if (m_ROI_index == 0)
          {
              for (int i = 1; i < 5; i++) m_ROIs[i] = new ROI();
          }
          m_ROIs[m_ROI_index].m_nType = 0;
          m_ROIs[m_ROI_index].m_fDatas.Clear();
          //一般要求图片 大于30万像素
          m_ROIs[m_ROI_index].m_fDatas.Add((Single)m_raw_mat.Width / 4);
          m_ROIs[m_ROI_index].m_fDatas.Add((Single)m_raw_mat.Height / 4);
          m_ROIs[m_ROI_index].m_fDatas.Add((Single)3 * m_raw_mat.Width / 4);
          m_ROIs[m_ROI_index].m_fDatas.Add((Single)3 * m_raw_mat.Height / 4);
      }

      Disp_InterActive_ROIs_without_Update_Image(m_ROIs, MainColor_Roi, n_draw_ROI_thick); 
      m_ROI_draw_info.draw_mode = ROIDRAWMODE.NONE; 
  }

5 MouseDown选中ROI

这里以ROI_Rect1为例
mouseDown

private void pB_Display_MouseDown(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Left && e.Clicks == 1)
  {
      try
      {
          lock (mutex_display)
          {
              m_MouseAction = 0;
              m_pLast.X = e.X;
              m_pLast.Y = e.Y;
              m_pCur.X = e.X;
              m_pCur.Y = e.Y; 

              OpenCvSharp.Point pt_img = DispManager.get_DispCTX().get_point_in_img(e.X, e.Y);
              float x_img = pt_img.X;
              float y_img = pt_img.Y;
              if (m_ROI_index != -1)
              {
                  if (!BD_Window_State_Judge()) return;
                  bd_window_state = BDDISPLAY_STATE.display_overlay;
                  // 进行交互画图
                  try
                  {
                      switch (m_ROItool_Type)
                      {
                          case 0: //none
                              m_MouseAction = ROI_MOUSE_ACTION.None;
                              break;
                          case ROITOOL_TYPE.PAN://pan mode
                              m_MouseAction = ROI_MOUSE_ACTION.DragImage;
                              break;
                          case ROITOOL_TYPE.RECT1:// rect1
                                 //step0: 判断 
                              if (m_ROIs[m_ROI_index].m_nType != 0 || m_ROIs[m_ROI_index].m_fDatas.Count == 0)
                              {
                                  m_ROI_draw_info.draw_mode = ROIDRAWMODE.NEWDRAW;
                                  m_ROIs[m_ROI_index].m_nType =(int)( m_ROItool_Type - 2);
                                  m_ROIs[m_ROI_index].m_fDatas.Add((Single)x_img);
                                  m_ROIs[m_ROI_index].m_fDatas.Add((Single)y_img);
                                  m_ROIs[m_ROI_index].m_fDatas.Add((Single)x_img);
                                  m_ROIs[m_ROI_index].m_fDatas.Add((Single)y_img);
                                  Disp_InterActive_ROIs_without_Update_Image(m_ROIs, MainColor_Roi, n_draw_ROI_thick);
                                  m_ROI_draw_info.selected_point_index = 1;// 默认第2个点
                                  m_ROI_draw_info.draw_mode = ROIDRAWMODE.DRAGPOINT;
                                  m_MouseAction = ROI_MOUSE_ACTION.DragROI;
                                  break;
                              }
                              if (m_ROIs[m_ROI_index].m_nType == 0 && m_ROIs[m_ROI_index].m_fDatas.Count == 4) //rect
                              {
                                  // 2.1 判断key point是否选中
                                  m_ROI_draw_info.selected_point_index = get_interactive_key_draw_point((int)x_img, (int)y_img); ;
                                  switch (m_ROI_draw_info.selected_point_index)
                                  {
                                      case 0:
                                          m_ROI_draw_info.draw_mode = ROIDRAWMODE.DRAGPOINT; 
                                          break;
                                      case 1:
                                          m_ROI_draw_info.draw_mode = ROIDRAWMODE.DRAGPOINT; 
                                          break;
                                      case 2:
                                          m_ROI_draw_info.draw_mode = ROIDRAWMODE.SHIFTROI; 
                                          break;
                                      case -1:
                                          m_ROI_draw_info.draw_mode = 0;
                                          break;
                                      default:
                                          m_ROI_draw_info.draw_mode = 0;
                                          break;
                                  }
                                  m_MouseAction = ROI_MOUSE_ACTION.DragROI;
                                  break;
                              }
                              break;
                          default:
                              break;
                      }
                      if (m_MouseAction == ROI_MOUSE_ACTION.DragROI)
                      {
                          Clear_Extract_Zoom_Overlay();
                          // 后续可以改善成 只清除局部区域 
                      }
                  }
                  catch (Exception ex)
                  {
                      m_MouseAction = ROI_MOUSE_ACTION.None;
                      label_img_info.Text = "Mouse Down:" + ex.Message;
                  }
                  // 保存 old ROIs clear用
                  m_old_ROIs = m_ROIs;
                  bd_window_state = BDDISPLAY_STATE.idle;
              }
          }
      }
      catch (Exception ex)
      {
          m_MouseAction = ROI_MOUSE_ACTION.None;
          label_img_info.Text = "Mouse Down:" + ex.Message;
      }
  }
}
       

6 MouseMove 拖动ROI

鼠标拖动ROI的某个关键点或者整体平移ROI
mousemove

private void pB_Display_MouseMove(object sender, MouseEventArgs e)
{
   // 2022 08 13 改善 pan img 图片很大时 迟钝 ,mouse move的频率看起来比 hscr 要快 
   if (m_MouseAction == ROI_MOUSE_ACTION.DragImage)
   {
       double t_gap = DateTime.Now.Subtract(_last_pan).TotalMilliseconds;
       if (t_gap < 40) return;
   }

   double m_rvalue, m_gvalue, m_bvalue;
   float x_img, y_img;
   int nRet = 0;
   try
   {
       if (!BD_OperateSet.MatisNotNull(m_raw_mat)) return;
       lock (mutex_display)
       {
           if (m_MouseAction != ROI_MOUSE_ACTION.None)
           {
               if ((m_MouseAction != ROI_MOUSE_ACTION.DragImage && m_MouseAction != ROI_MOUSE_ACTION.DragROI) || !BD_Window_State_Judge()) return;
               bd_window_state = BDDISPLAY_STATE.mouse_drag;

               try
               {
                   if (m_MouseAction != ROI_MOUSE_ACTION.WheelImage && e.Button == MouseButtons.Left)// 只有鼠标左键可以drag
                   {
                       // 只有两种情况 dragimg 或者 dragROI 
                       if (m_MouseAction == ROI_MOUSE_ACTION.DragImage || m_MouseAction == ROI_MOUSE_ACTION.DragROI)
                       {
                           lock (mutex_display)
                           {
                               m_pCur.X = e.X;
                               m_pCur.Y = e.Y;
                               m_pDist_mouse.X = (int)(m_pCur.X - m_pLast.X);
                               m_pDist_mouse.Y = (int)(m_pCur.Y - m_pLast.Y);
                               m_pDist_img = DispManager.get_DispCTX().get_mousemove_shift_in_ccs(m_pDist_mouse);
                               switch (m_ROItool_Type)
                               {
                                   case 0:// none
                                       break;
                                   case ROITOOL_TYPE.PAN:// pan
                                       {
                                           DispManager.get_DispCTX().update_Scroll_Info_after_pan(m_pDist_mouse);
                                           update_ExtractRGB_and_NewOverlay();
                                           //更新显示
                                           Flush_Overlay_to_Display();
                                       }
                                       break;
                                   default:
                                       switch (m_ROI_draw_info.draw_mode)
                                       {
                                           case 0://  none
                                               break;
                                           case ROIDRAWMODE.NEWDRAW:// new draw
                                               break;
                                           case ROIDRAWMODE.DRAGPOINT: // dragon
                                           case ROIDRAWMODE.SHIFTROI: // shift 
                                               {
                                                   Clear_InterActive_ROIs(m_old_ROIs, Black, n_draw_ROI_thick);
                                                   drag_interactive_ROI(m_pDist_img.X, m_pDist_img.Y);
                                                   Disp_InterActive_ROIs_without_Update_Image(m_ROIs, MainColor_Roi, n_draw_ROI_thick);
                                                 
                                               }
                                               break;
                                           default:
                                               break;
                                       }
                                       break;
                               }
                               // 保存 old ROIs clear用
                               m_old_ROIs = m_ROIs;
                           }
                       }
                       // 这里更新 m_pLast 是因为 ROI 更新时 也是实时更新 ROI 的数据的
                       // 如果改成 Roi_last 一直不变 ,然后显示临时ROI ,这样 就可以不用更新m_pLast, 这样会更加准确
                       switch (m_ROItool_Type)
                       {
                           case ROITOOL_TYPE.PAN:// pan
                               m_pLast.X = m_pCur.X;
                               m_pLast.Y = m_pCur.Y;
                               break;
                           default:
                               m_pLast.X = m_pCur.X;
                               m_pLast.Y = m_pCur.Y;
                               break;
                       }
                   }
               }
               catch (Exception ex)
               {
                   label_img_info.Text = "MouseMove:" + ex.Message;
               }
               bd_window_state = BDDISPLAY_STATE.idle; 
           }
           //if (m_MouseAction == ROI_MOUSE_ACTION.None) //  空余时间 显示图像信息
           else
           {
               // disp img info
               // 参考以前代码源程序
           }
       }
   }
   catch (Exception ex)
   {
       label_img_info.Text = "MouseMove:" + ex.Message;
   }

   _last_pan = DateTime.Now;
}
        

6 MouseUp事件

标志位复位
m_ROI_draw_info.draw_mode = 0;
m_ROI_draw_info.selected_point_index = -1;

7 未完待续,后续会附上新增的源代码

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

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

相关文章

压缩pdf文件大小,压缩pdf文件大小软件哪个好

在数字化时代&#xff0c;PDF文件因其卓越的跨平台兼容性和稳定性而成为工作与学习的好帮手。然而&#xff0c;当PDF文件体积过大时&#xff0c;传输和存储便成了一项挑战。别担心&#xff0c;本文将为你揭秘如何快速压缩PDF文件&#xff0c;让你的文档轻装上路&#xff01; 压…

【Python实战因果推断】14_线性回归的不合理效果4

目录 Debiasing Step Denoising Step Standard Error of the Regression Estimator Debiasing Step 回想一下&#xff0c;最初由于混杂偏差&#xff0c;您的数据看起来是这样的、 随着信贷额度的增加&#xff0c;违约率呈下降趋势&#xff1a; 根据 FWL 定理&#xff0c;您可…

力扣习题--哈沙德数

一、前言 本系列主要讲解和分析力扣习题&#xff0c;所以的习题均来自于力扣官网题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 二、哈沙德数 1. 哈沙德数 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&…

JAVA学习笔记-JAVA基础语法-DAY21-缓冲流、转换流、序列化流

第一章 缓冲流 昨天学习了基本的一些流&#xff0c;作为IO流的入门&#xff0c;今天我们要见识一些更强大的流。比如能够高效读写的缓冲流&#xff0c;能够转换编码的转换流&#xff0c;能够持久化存储对象的序列化流等等。这些功能更为强大的流&#xff0c;都是在基本的流对象…

【echarts】拖拽滑块dataZoom-slider自定义样式,简单适配移动端

电脑端 移动端 代码片段 dataZoom: [{type: inside,start: 0,end: 100},{type: slider,backgroundColor: #F2F5F9,fillerColor: #BFCCE3,height: 13, // 设置slider的高度为15start: 0,end: 100,right: 60,left: 60,bottom: 15,handleIcon:path://M30.9,53.2C16.8,53.2,5.3,41.…

【Git 学习笔记】1.3 Git 的三个阶段

1.3 Git 的三个阶段 由于远程代码库后续存在新的提交&#xff0c;因此实操过程中的结果与书中并不完全一致。根据书中 HEAD 指向的 SHA-1&#xff1a;34acc370b4d6ae53f051255680feaefaf7f7850d&#xff0c;可通过以下命令切换到对应版本&#xff0c;并新建一个 newdemo 分支来…

基于LSTM、GRU和RNN的交通时间序列预测(Python)

近年来&#xff0c;人工智能技术的发展推动了智慧交通领域的进步&#xff0c;交通流预测日益成为研究热点之一。交通流预测是基于历史的交通数据对未来时段的交通流状态参数进行预测。作为交通流状态的直接反映&#xff0c;交通流参数的预测结果可以直接应用于 ATIS 和ATMS 中&…

QT Designer中的qrc文件如何创建,将图片添加进qrc文件

创建qrc文件可以在qt中给空间添加个性化属性 一、创建qrc文件的方式 1、将以下代码复制到txt文件文件中 <!DOCTYPE RCC> <RCC version"1.0"> <qresource prefix"/"><file>background_img.png</file><file>backgrou…

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债&#xff0c;全称是“可转化公司债券”&#xff0c;是上市公司为了融资&#xff0c;向社会公众所发行的一种债券&#xff0c;具有股票和债券的双重特点&#xff0c;投资者可以选择按照发行时约定的价格将债券转化成公司一般股票&#xff0c;也可作为债券持有到期后收取本…

计算机网络网络层复习题1

一. 单选题&#xff08;共27题&#xff09; 1. (单选题)以太网 MAC 地址、IPv4 地址、IPv6 地址的地址空间大小分别是&#xff08; &#xff09;。 A. 2^48&#xff0c;2^32&#xff0c;2^128B. 2^32&#xff0c;2^32&#xff0c;2^96C. 2^16&#xff0c;2^56&#xff0c;2^6…

【51单片机入门】矩阵键盘

文章目录 前言矩阵键盘介绍与检测原理原理图代码讲解总结 前言 在嵌入式系统设计中&#xff0c;键盘输入是一种常见的人机交互方式。其中&#xff0c;矩阵键盘因其简单、方便和易于扩展的特性&#xff0c;被广泛应用于各种设备中。本文将介绍如何使用51单片机来实现矩阵键盘的…

修改Springboot项目名称

修改Springboot项目名称 1. 整体描述2. 具体步骤2.1 修改module名称2.2 修改程序包名2.3 mybatis/mybatis-plus配置修改2.4 logback文件2.5 yml配置2.6 Application启动类2.7 其他 3. 总结 1. 整体描述 开发过程中&#xff0c;经常遇到新来个项目&#xff0c;需要一份初始代码…

数字化精益生产系统--RD研发管理系统

R&D研发管理系统是一种用于管理和监督科学研究和技术开发的软件系统&#xff0c;其设计和应用旨在提高企业研发活动的效率、质量和速度。以下是对R&D研发管理系统的功能设计&#xff1a;

学习springMVC

第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架&#xff0c; 是Spring Framework生态中的一个独立模块&#xff0c;它基于 Spring 实现了Web MVC&#xff08;数据、业务与展现&#xff09;设计模式的请求驱动类型的轻量级Web框架&am…

和鲸“101”计划领航!和鲸科技携手北中医,共话医学+AI 实验室建设及创新人才培养

为进一步加强医学院校大数据管理与应用、信息管理与信息系统&#xff0c;医学信息工程等专业建设&#xff0c;交流实验室建设、专业发展与人才培养经验&#xff0c;6 月 22 日&#xff0c;由北京中医药大学&#xff08;简称“北中医”&#xff09;主办&#xff0c;上海和今信息…

使用Spring Boot实现博客管理系统

文章目录 引言第一章 Spring Boot概述1.1 什么是Spring Boot1.2 Spring Boot的主要特性 第二章 项目初始化第三章 用户管理模块3.1 创建用户实体类3.2 创建用户Repository接口3.3 实现用户Service类3.4 创建用户Controller类 第四章 博客文章管理模块4.1 创建博客文章实体类4.2…

to_json 出现乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

PyCharm远程开发

PyCharm远程开发 1- 远程环境说明 每个人的本地电脑环境差别很大。各自在自己电脑上开发功能&#xff0c;测试/运行正常。但是将多个人的代码功能合并&#xff0c;运行服务器上&#xff0c;会出现各种版本兼容性问题。 在实际企业中&#xff0c;一般会有两套环境。第一套是测…

2.3 主程序和外部IO交互 (文件映射方式)----IO Server实现

2.3 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Server C实现 效果显示 1 内存共享概念 基本原理&#xff1a;以页面为单位&#xff0c;将一个普通文件映射到内存中&#xff0c;达到共享内存和节约内存的目的&#xff0c;通常在需要对文件进行频繁读写时…

【单片机毕业设计选题24043】-可旋转式电视支架控制系统设计与实现

系统功能: 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用电视支架系统请稍后”&#xff0c;两秒后进入正常界面显示 第一页面第一行显示 Mode:Key&#xff0c; 第二行显示 TV:Middle 短按B5按键可控制步进电机左转&#xff0c; 第二行显示 TV:Left 后正常显示 TV:…