[图像处理] MFC载入图片并绘制ROI矩形

news2024/11/25 10:27:48

上一篇:
[图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示

文章目录

  • 前言
  • 完整代码
  • 重要代码
  • 效果

前言

上一篇实现了MFC通过Picture控件载入图片。
这一篇实现ROI功能的第一部分,在Picture控件中,通过鼠标拖拽画出一个矩形。

完整代码

MFC简单的图片处理工程-Gitee

重要代码

鼠标左键按下事件,记录左键按下时的坐标。

void CGDITESTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	ClientToScreen(&point);
	GetDlgItem(IDC_PIC_DISPLAY)->GetWindowRect(&rc_dsp);
	if (rc_dsp.PtInRect(point)) //判断鼠标左键落下时,point是否在控件的rect范围内
	{
		m_startPt = point;
	}

	CDialogEx::OnLButtonDown(nFlags, point);
}

鼠标左键抬起事件,记录左键抬起时的坐标,并在Picture控件的DC中绘制矩形

void CGDITESTDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	CRect rect;
	int rect_width = 0;
	int rect_height = 0;
	CPoint sel_pos;
	//GetCursorPos(&sel_pos);
	ClientToScreen(&point);
	GetDlgItem(IDC_PIC_DISPLAY)->GetWindowRect(&rc_dsp);
	if (rc_dsp.PtInRect(point) && m_IsChoose)//判断鼠标左键抬起时,point是否在控件的rect范围内
	{
		//ClipCursor(&rc_dsp);

		//计算ROI的topleft和rightbottom坐标
		if(point.x > m_startPt.x)
			m_endPt.x = point.x < rc_dsp.right? point.x:rc_dsp.right;
		else
			m_endPt.x = point.x > rc_dsp.left ? point.x : rc_dsp.left;

		if (point.y > m_startPt.y)
			m_endPt.y = point.y < rc_dsp.bottom ? point.y : rc_dsp.bottom;
		else
			m_endPt.y = point.y > rc_dsp.top ? point.y : rc_dsp.top;
#if 1
		CPoint tplt, rtbt;
		tplt.x = m_startPt.x < m_endPt.x ? m_startPt.x : m_endPt.x;
		tplt.y = m_startPt.y < m_endPt.y ? m_startPt.y : m_endPt.y;
		rtbt.x = m_startPt.x > m_endPt.x ? m_startPt.x : m_endPt.x;
		rtbt.y = m_startPt.y > m_endPt.y ? m_startPt.y : m_endPt.y;
		m_ctl_pic_dsp.ScreenToClient(&tplt);
		m_ctl_pic_dsp.ScreenToClient(&rtbt);
		
		CDC* pDC = m_ctl_pic_dsp.GetWindowDC();
		CPen pen(PS_SOLID, 1, RGB(255,0,0));
		pDC->SelectStockObject(NULL_BRUSH);
		pDC->SelectObject(&pen);
		pDC->Rectangle(CRect(tplt, rtbt));
#else
		//这里我本想在获取ROI的框选坐标后,通过dlg的OnPaint()函数来画矩形
		// 所以使用了以下两个函数激活OnPaint()
		// 但是却无法在picture控件上画矩形
		// 百度了一下,原因是要在picture控件的dc中画,而不是在dialog的dc中画。
		//Invalidate(); //清空窗口的客户区,激活OnPaint()
		//SendMessage(WM_PAINT);  //激活OnPaint()
#endif
	}

	CDialogEx::OnLButtonUp(nFlags, point);
}

效果

在这里插入图片描述

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

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

相关文章

JavaScript高级应用

学习作用域、变量提升、闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0c;降低代码的冗余度。 理解作用域对程序执行的影响 能够分析程序执行的作用域范围 理解闭包本质&#xff0c;利用闭包创建隔离作用域 了解…

OpenFOAM学习笔记

OpenFOAM 计算流体力学&#xff1a;用计算机求解流体控制方程&#xff0c;来模拟真实情况下&#xff0c;流体的流动状态OpenFOAM的离散方法&#xff1a;有限体积法&#xff0c;将整个空间划分成若干个控制体OpenFOAM使用的网格系统&#xff1a;同位网格&#xff08;Collocated…

博客部署002-centos安装nginx

1、centos 如何安装nginx? 在CentOS系统上安装Nginx的过程相对直接&#xff0c;通常可以通过系统自带的Yum包管理器来安装。以下是安装Nginx的最新稳定版的步骤&#xff1a; 1.1 更新系统软件包 在安装Nginx之前&#xff0c;首先确保系统软件包是最新的&#xff0c;运行…

ES学习笔记01

1.ES安装 下载地址&#xff1a; es官网下载 这里使用的是7.8.0的版本信息 下载完成后解压即可完成安装 2.启动运行 点击bin目录下的elasticsearch.bat文件即可启动 在浏览器中输入localhost:9200显示如下&#xff1a; 在路径中加入对应访问后缀即可访问对应信息 如&#…

【Go】二十、反射

文章目录 1、反射2、对基本数据类型反射3、对结构体进行反射4、获取变量的类别5、通过反射修改基本类型变量的值6、通过反射操作结构体的属性和方法 1、反射 //核心包 import ("reflect")通过反射&#xff1a; 可以在运行时动态获取变量的类型、获取结构体的信息&a…

用苹果CMS一小时搭建自己的私人影院(仅供学习与参考,请勿用于商业用途)

用苹果CMS一小时搭建自己的私人影院&#xff08;仅供学习与参考&#xff0c;请勿用于商业用途&#xff09; 一、购买域名和服务器空间或虚拟主机空间。 二、下载苹果CMS影视安装程序到本地。 三、上传苹果CMS安装程序至你的空间并安装。 四、后台设置完善你的电影网站。 五、…

缓存击穿以及解决方案

1.定义 缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 问题描述&#xff1a;假设线程1在查询缓存之后&#xff0c;本来应该去查询数据库&#xff0c;然后把…

信息收集之内网渗透(二)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、前言 本文主要是一些命令的集合&#xff0c;会比较枯…

鸿蒙南向开发实战:【智能扫地机】

样例简介 ​ 此Demo采用润和的智能小车套件为硬件模型&#xff0c;通过修改代码具备了扫地机器人简易的避障功能及防跌落功能&#xff0c;并且能通过wifi接入数字管家应用场景。智能扫地机不仅能接收数字管家应用下发的指令启动或停止扫地机器人&#xff0c;而且还可以加入到数…

定时器测试:用定时器监控定时器

using System; using System.Timers;namespace TestTimer {internal class Program{private static int usingResource 0;static int m 0;static Timer timerTask new Timer();static Timer timerMonitor new Timer();static void Main(string[] args){//任务 定时器timerT…

大模型系列——解读RAG

上篇大概说了几个优化方向&#xff0c;包括提示词&#xff0c;RAG等。那么RAG到底是什么呢&#xff1f;RAG 是2023年最流行的基于 LLM 的应用系统架构。有许多产品几乎完全建立在 RAG 之上&#xff0c;覆盖了结合网络搜索引擎和 LLM 的问答服务&#xff0c;到成千上万个数据聊天…

JSP课设:学校招生系统(附源码+调试)

Java web学校招生系统 Java web学校招生系统功能概述 &#xff08;1&#xff09;登录模块&#xff1a;学校招生系统提供管理员和考生两者登录角色&#xff0c;分别对应不同的功能&#xff0c;登录信息存储在数据库中。 &#xff08;2&#xff09;前台浏览&#xff1a;学校招生…

让智能体像Excel易用还要多久?

2023年&#xff0c;国内AI产业迎来狂飙时代。大模型热潮推动AI智能体&#xff08;AI Agent&#xff09;发展&#xff0c;继ChatGPT成功后&#xff0c;OpenAI目标直指AI Agents。上半年&#xff0c;行业竞相扩大模型规模、提升参数和计算能力&#xff0c;抢占AI浪潮先机。然而&a…

【Easy云盘 | 第二篇】后端统一设计思想

文章目录 4.1后端统一设计思想4.1.1后端统一返回格式对象4.1.2后端统一响应状态码4.1.3后端统一异常处理类4.1.4StringUtils类4.1.5 RedisUtils类 4.1后端统一设计思想 4.1.1后端统一返回格式对象 com.easypan.entity.vo.ResponseVO Data public class ResponseVO<T> …

AFCI 应用笔记三、使用 mlflow 管理模型

1. 简介 由于 AI 神经网络涉及多种参数&#xff0c;需要频繁修改各种超参数&#xff0c;比如&#xff1a;learning rate&#xff0c;batchsize&#xff0c;filter numbers&#xff0c;alpha 等等&#xff0c;每个参数都有可能影响到模型最终的准确率&#xff0c;所以比较这些参…

C语言——顺序表

文章目录 一、线性表二、顺序表顺序表和数组的区别顺序表的分类1.静态顺序表2.动态顺序表 三、动态顺序表的实现1.动态顺序表头文件2.动态顺序表源文件3.测试源文件 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种…

软考——数据库系统工程师

时间周期 流水线 IO功能 基本出现的选项中是必考而且基本都是全选 系统总线 后缀表达式 必考2分 答案&#xff1a;B 、 A 用栈来进行计算的。 第一个题先进行36-34的运算&#xff0c;所以是数字后面的第一个符号是减号呀&#xff01;&#xff01;&#xff01; 很重要的知识点…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算&#xff0c;整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&am…

27.WEB渗透测试-数据传输与加解密(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…

二分答案 蓝桥杯 2022 省A 青蛙过河

有些地方需要解释&#xff1a; 1.从学校到家和从家到学校&#xff0c;跳跃都是一样的&#xff0c;直接看作2*x次过河就可以。 2.对于一个跳跃能力 y&#xff0c;青蛙能跳过河 2x 次&#xff0c;当且仅当对于每个长度为 y 的区间&#xff0c;这个区间内 h 的和都大于等于…