首页 > 编程语言 >2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

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

时间:2024-06-30 23:29:58浏览次数:3  
标签:控件 draw img ROI C# index break ROIs

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 未完待续,后续会附上新增的源代码

标签:控件,draw,img,ROI,C#,index,break,ROIs
From: https://blog.csdn.net/weixin_42490025/article/details/140010195

相关文章

  • 深度学习CUDA Out of Memory原因总结和方法
    CUDAOutofMemory原因总结和方法原因总结显存不足:深度学习模型(尤其是大型模型)在训练或推理时需要大量的显存。如果显存容量不足,会导致CUDAOutofMemory错误。批处理大小过大:在训练过程中,批处理(batch)大小设置过大时,会占用过多的显存,导致显存溢出。模型过大:模型......
  • 【Effective Python教程】(90个有效方法)笔记——第3章:函数——24:用None和docstring来描
    文章目录第3章:函数第24条用None和docstring来描述默认值会变的参数函数默认值的坑(函数的默认参数值只在定义函数时计算)解决方法:将函数默认参数值设为None,然后再在函数体中判断并初始化函数默认参数值设置为None的其他应用示例“函数默认参数值设置为None”与“函数参数......
  • C++11新特性
    1.字符串原始字面量        在C++11中添加了定义原始字符串的字面量,定义方式为:R“xxx(原始字符串)xxx”其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。        比如:编程过程中,使用的字符串中......
  • AS-V1000外部设备管理介绍(国标GB28181设备管理,可以管理的国标设备包括DVR/NVR、IPC、
    目录一、概述1、视频监控平台介绍2、外部设备定义(接入的国标设备)二、外部设备管理2.1外部设备添加(1)设备侧的配置(2)平台侧的配置2.2外部设备信息的修改三、外部通道管理3.1外部通道同步3.2外部通道删除3.3外部通道参数修改四、目录同步和挂接4.1目录同步4.......
  • 【使用sudo apt-get出现报错】——无法获得锁 /var/lib/dpkg/lock-open(11:资 源暂时
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、ubuntu中进程正在被占用1.问题描述2.原因分析3.解决总结前言一、ubuntu中进程正在被占用1.问题描述在Ubuntu中,使用终端时输入带有sudoapt-get指令更新软件包时,出现如下的报......
  • 337.特色品牌西餐厅瀑布流响应式网页 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有Web前端网页制作的各行各业的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • webrtc 的datachannel在golang中的使用
    因为在发送端需要接收一些接收端的统计信息,而且具有不可丢失的需求,所以采取利用datachannel进行传输。datachannel是基于sctp协议的传输通道,sctp可提供按需可靠到达的服务,在datachannel中可以设置是否按序,是否可靠,最大重传次数,数据最大保存时间(当数据超过保存时间仍未发出时将被丢......
  • CentOS7.9部署Redis
    简介本章节主要讲的是在Linux系统CentOS7.9上去完成Redis软件的安装步骤1.下载Redis安装包2.解压Redis压缩包3.yum安装gcc依赖4.跳转到Redis解压目录下5.编译安装6.启动Redis实施1.下载Redis安装包wgethttp://download.redis.io/releases/redis-4.0.6.t......
  • C++11 mem_fn成员指针包装器
    C++11mem_fn成员指针包装器介绍函数模板std::mem_fn生成成员指针的包装器对象,用于存储、复制及调用成员指针。指向对象的引用和指针(包括智能指针)都可以在调用std::mem_fn时使用。注意:std::mem_fn只能包装public的成员指针,不能包装全局函数这里的成员指针指的是成员......
  • Tomcat
    Tomcat一、Tomcat概述1、Tomcat的概念Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用......