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

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  ROIdiscriptorpublic 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: //nonem_MouseAction = ROI_MOUSE_ACTION.None;break;case ROITOOL_TYPE.PAN://pan modem_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:// nonebreak;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://  nonebreak;case ROIDRAWMODE.NEWDRAW:// new drawbreak;case ROIDRAWMODE.DRAGPOINT: // dragoncase 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:// panm_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.rhkb.cn/news/367066.html

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

相关文章

207.贪心算法:最大子数组和(力扣)

代码展示 class Solution { public:int maxSubArray(vector<int>& nums) {int result INT_MIN; // 初始化结果为最小可能的整数int sum 0; // 初始化当前子数组和为0// 遍历数组中的每一个元素for (int i 0; i < nums.size(); i){sum nums[i]; //…

昇思25天学习打卡营第9天|MindSpore-Vision Transformer图像分类

Vision Transformer图像分类 Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性,它已经能够训练具有超过100B参数的空前…

LinkedList底层原理

LinkedList特有方法 源码分析

使用工业自动化的功能块实现大语言模型应用

大语言模型无所不能&#xff1f; 以chatGPT为代表的大语言模型横空出世&#xff0c;在世界范围内掀起了一场AI革命。给人的感觉似乎大模型语言无所不能。它不仅能够生成文章&#xff0c;图片和视频&#xff0c;能够翻译文章&#xff0c;分析科学和医疗数据&#xff0c;甚至可以…

前端git约定式规范化提交-commitizen

当使用commitizen进行代码提交时&#xff0c;commitizen会提示你在提交代码时填写所必填的提交字段信息内容。 1、全局安装commitizen npm install -g commitizen4.2.4 2、安装并配置 cz-customizeable 插件 2.1 使用 npm 下载 cz-customizeable npm i cz-customizeable6.…

低代码组件扩展方案在复杂业务场景下的设计与实践

组件是爱速搭的前端页面可视化模块的核心能力之一&#xff0c;它将前端研发人员从无休止的页面样式微调和分辨率兼容工作中解放了出来。 目前&#xff0c;爱速搭通过内置的上百种功能组件&#xff08;120&#xff09;&#xff0c;基本可以覆盖大部分中后台页面的可视化设计场景…

软件鉴定测试的工作内容是什么?专业软件鉴定测试报告获取指南

软件鉴定测试是指对软件产品进行全面的检测和评估&#xff0c;以验证其是否符合规定的标准和要求。通过测试&#xff0c;能够发现软件中存在的问题和缺陷&#xff0c;并提供相应的改进建议。在不同的测试阶段&#xff0c;使用不同的测试方法和工具&#xff0c;包括功能测试、性…

数据分析如何在企业中发挥价值

数据分析如何在企业中发挥价值 数据分析的目的是什么为什么怎么做做什么 思考问题流程确认问题拆解问题量化分析 分析数据流程收集数据处理数据制作图表 全流程 数据分析的目的 是什么 通过数据量化企业当前的经营现状或业务事实&#xff0c;将业务细节转换为具体数据&#xf…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie&#xff0c;网络爬虫是一种自动化程序&#xff0c;用于在互联网上收集信息并进行索引&#xff0c;这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统&#xff1a;Windows10系统、Dell G3电脑。 “爬虫…

数据库取出来的日期格式是数组格式,序列化日期格式

序列化前&#xff0c;如图所示&#xff1a; 解决方式&#xff0c;序列化日期&#xff08;localdatetime&#xff09;格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…

Python编写简单爬虫

文章目录 Python编写简单爬虫安装必要的库编写爬虫代码解析和存储数据注意事项 Python编写简单爬虫 安装必要的库 在开始编写爬虫之前&#xff0c;你需要安装一些必要的库。我们将使用requests库来发送HTTP请求&#xff0c;使用BeautifulSoup库来解析HTML内容。你可以使用以下…

fiddler抓https包

1&#xff0c;安装fiddler省略 2&#xff0c;下载证书步骤&#xff1a;tools-options-https 点击确认&#xff0c;点击OK&#xff0c;点击是 把证书安装到谷歌浏览器上步骤&#xff1a;点击谷歌浏览器右上角的设置&#xff0c;在搜索框中搜索证书&#xff0c;点击“证书管理”…

win10下Python的安装和卸载

前言 之前电脑上安装了python3.9版本&#xff0c;因为工作需要使用3.6版本的Python&#xff0c;需要将3.9版本卸载&#xff0c;重新安装3.6版本。下面就是具体的操作步骤: 1. 卸载 在我的电脑中搜索到3.9版本的安装文件&#xff0c;如下图&#xff1a; 双击该应用程序&#xf…

DevOps认证是什么?DevOps工具介绍

DevOps 这个词是由Development&#xff08;开发&#xff09; 和 Operations&#xff08;运维&#xff09;组合起来的&#xff0c;你可以把它理解成为一种让开发团队和运维团队紧密合作的方法。 DevOps从2009年诞生到现在已经14年多了&#xff0c;一开始大家还在摸索&#xff0…

马斯克宣布xAI将在8月份推出Grok-2大模型 预计年底推出Grok-3

在今年内&#xff0c;由特斯拉创始人马斯克创立的人工智能初创公司xAI将推出两款重要产品Grok-2和Grok-3。马斯克在社交平台上透露了这一消息&#xff0c;其中Grok-2预计在今年8月份面世&#xff0c;而Grok-3则计划于年底前亮相。 除此之外&#xff0c;马斯克还表示&#xff0c…

WLAN的WPA3安全技术

Wi-Fi安全加密的演进下图所示&#xff0c;当前最新的加密方式是WPA3。WPA3对现有网络提供了全方位的安全防护&#xff0c;增强了公共网络、家庭网络和802.1X企业网的安全性。 WPA3的核心为对等实体同时验证方式(Simultaneous Authentication of Equals, SAE)&#xff0c;即通信…

Android AlertDialog对话框

目录 AlertDialog对话框普通对话框单选框多选框自定义框 AlertDialog对话框 部分节选自博主编《Android应用开发项目式教程》&#xff08;机械工业出版社&#xff09;2024.6 在Android中&#xff0c;AlertDialog弹出对话框用于显示一些重要信息或者需要用户交互的内容。 弹出…

双目摄像头测距

Opencv双目校正函数 stereoRectify 详解 参数说明&#xff1a; 输入参数&#xff1a; cameraMatrix1&#xff1a;左目相机内参矩阵 distCoeffs1&#xff1a;左目相机畸变参数 cameraMatrix2&#xff1a;右目相机内参矩阵 distCoeffs2&#xff1a;右目相机畸变参数 imageSize&…

使用 ADB 查看 Android 设备的 CPU 使用率(详解)

在 Android 开发和调试过程中&#xff0c;监控设备的性能数据至关重要。CPU 使用率是一个关键的性能指标&#xff0c;它能够帮助开发者识别应用的性能瓶颈和优化机会。本文将详细介绍如何使用 Android Debug Bridge (ADB) 查看设备的 CPU 使用率&#xff0c;并解释终端上各个参…

LLM指令微调Prompt的最佳实践(二):Prompt迭代优化

文章目录 1. 前言2. Prompt定义3. 迭代优化——以产品说明书举例3.1 产品说明书3.2 初始Prompt3.3 优化1: 添加长度限制3.4 优化2: 细节纠错3.5 优化3: 添加表格 4. 总结5. 参考 1. 前言 前情提要&#xff1a; 《LLM指令微调Prompt的最佳实践&#xff08;一&#xff09;&#…