当前位置: 首页 > news >正文

【18】MFC入门到精通——MFC(VS2019)+ OpenCV 显示图片的3种方法

MFC (VS2019)+ OpenCV,显示图片的3种方法

  • 1 方法介绍
  • 2 方法一:嵌套OpenCV窗口显示图片
    • 2.1 建立供工程 添加控件
    • 2.2 引用头文件
    • 2.3 找到OnInitDialog()函数,在其中添加如下代码
    • 2.4 在button触发函数中加入代码(就是你双击button进入的函数)
    • 2.5 注意事项
  • 3 方法二: 转换图片格式
    • 3.1 MatToCImage格式转换 定义
    • 3.2 OnPaint() 添加代码 画出图像
  • 4 方法三: OpenCV图片保存后,再用FMC读取显示
    • 4.1 添加代码
    • 4.2 为什么要先保存在读取呢?

1 方法介绍

1、嵌套。 直接将OpenCV窗口嵌套到MFC的Pictrue Control控件中。此方法既能直接显示图片,也可直接使用OpenCV的鼠标按键事件,但对于鼠标滚轮事件只能使用MFC本地的滚轮函数。

2、转换。 将OpenCV读取或处理的图片转换格式,使之成为MFC的Pictrue Control控件可显示的图片格式。此方法每刷新一次图片便需要转换格式一次,比较麻烦,且只能使用MFC的鼠标事件。

3、保存。 将OpenCV读取或处理的图片保存为本地图片,然后用MFC读取图片的方法读取并显示。此方法是笨方法,在特定情况下使用,保存和读取图片比较耗时,但无需转换格式,同样只能使用MFC的鼠标事件。

2 方法一:嵌套OpenCV窗口显示图片

嵌套。直接将OpenCV窗口嵌套到MFC的Pictrue Control控件中。此方法既能直接显示图片,也可直接使用OpenCV的鼠标按键事件,但对于鼠标滚轮事件只能使用MFC本地的滚轮函数。

2.1 建立供工程 添加控件

新建工程,命名为 showRealVideo,创建好之后,自动生成以下文件
在这里插入图片描述

打开对话框后,
在工具箱选择picture control控件,并拖到对话框内,(右键修改属性),修改ID为IDC_PICTURE_STATIC
添加一个Button按钮,修改ID为IDC_PICTURE_BUTTON,描述文字为 “显示图像”

在这里插入图片描述

在这里插入图片描述

双击button (“显示图像”)按钮,之后可以进入****Dlg.cpp,在里面进行如下修改代码
在这里插入图片描述

在这里插入图片描述

编写代码,只需修改MFCApplication1Dlg.cpp文件。

具体修改步骤如下:

2.2 引用头文件

在showRealVideoDlg.cpp中 添加opencv头文件
在这里插入图片描述

#include <opencv2/opencv.hpp>
//cvGetWindowHandle("ImageShow");//嵌套opencv窗口,需要使用下面头文件
#include<opencv2/highgui/highgui_c.h>

2.3 找到OnInitDialog()函数,在其中添加如下代码

在这里插入图片描述

// TODO: 在此添加额外的初始化代码cv::namedWindow("ImageShow");//创建OpenCV窗口HWND  hWnd = (HWND)cvGetWindowHandle("ImageShow");//嵌套opencv窗口HWND hParent = ::GetParent(hWnd);::SetParent(hWnd,GetDlgItem(IDC_PICTURE_STATIC)->m_hWnd);::ShowWindow(hParent,SW_HIDE);

2.4 在button触发函数中加入代码(就是你双击button进入的函数)

在这里插入图片描述

void CshowRealVideoDlg::OnBnClickedPictureButton()
{// TODO: 在此添加控件通知处理程序代码cv::Mat img = cv::imread("D:\\Projects\\test_Images\\9.jpg");CRect rect;CWnd* pWnd = GetDlgItem(IDC_PICTURE_STATIC);//获取picture control控件pWnd->GetClientRect(&rect);//控制图片的大小cv::resize(img, img, cv::Size(rect.Width(), rect.Height()));//将图片resize,适用窗口尺寸imshow("ImageShow", img);}

在这里插入图片描述
在这里插入图片描述

2.5 注意事项

如果图片没有resize,那么图片将以原尺寸显示,不会自适应窗口大小;

超出窗口以外的尺寸,就不会显示。

void CshowRealVideoDlg::OnBnClickedPictureButton()
{// TODO: 在此添加控件通知处理程序代码cv::Mat img = cv::imread("D:\\Projects\\test_Images\\9.jpg");CWnd* pWnd = GetDlgItem(IDC_PICTURE_STATIC);//获取picture control控件imshow("ImageShow",img);
}

在这里插入图片描述

也可以将代码全部写在Button按钮函数中,
即将OnInitDialog()函数中自己添加的代码,剪切到OnBnClickedPictureButton()函数里。
在这里插入图片描述

3 方法二: 转换图片格式

转换。 将OpenCV读取或处理的图片转换格式,使之成为MFC的Pictrue Control控件可显示的图片格式。此方法每刷新一次图片便需要转换格式一次,比较麻烦,且只能使用MFC的鼠标事件。

1、新建MFC应用程序、添加Pictrue Control控件(同上)

2、引用头文件

在showRealVideoDlg.cpp中 添加opencv头文件,
并声明函数 void MatToCImage(Mat &mat, CImage &cImage);
在这里插入图片描述

#include <opencv2/opencv.hpp>
	void MatToCImage(cv::Mat& mat, CImage& cImage);

3.1 MatToCImage格式转换 定义

//在CshowRealVideoDlg::.cpp最后添加MatToCImage函数定义

http://www.dtcms.com/a/282176.html

相关文章:

  • Linux Java环境配置
  • xss-labs 1-8关
  • 智芯Z20K11xM MCU开发之TDG触发Adc
  • 新疆兵团第六师新湖农场食记
  • 企业级AI项目未达预期:非结构化数据处理背后有何玄机?
  • es启动问题解决
  • Python 日志轮换处理器的参数详解
  • 元宇宙经济:虚实融合引发经济新变革
  • audiorecord 之 抢占优先级
  • 【世纪龙科技】汽车发动机拆装检修仿真教学软件-仿真精进技能
  • JAVA进阶 项目实战:汽车租聘系统
  • 黄仁勋:早知道雷军会有非凡成功,想买一辆小米汽车
  • 汽车免拆诊断案例 | 2015款进口起亚索兰托L车漏电
  • 自动化框架 Selenium 的使用
  • C++ 异常处理、typeid
  • 霍尔电流传感器在新能源汽车中的应用综述
  • 量子计算实用算法:2025年突破性进展与产业落地全景
  • 汽车功能安全-在系统层面验证TSR实例
  • 【React Native】布局和 Stack 、Slot
  • BNN 技术详解:当神经网络只剩下 +1 和 -1
  • 神经网络常见激活函数 13-Softplus函数
  • 重生之我在打御网杯打半决赛(高职组)
  • FCN语义分割笔记(1)
  • 大语言模型(LLM)训练的教师强制(Teacher Forcing)方法
  • 人工智能之数学基础:神经网络之多样本矩阵参数求导
  • Java线程创建与运行全解析
  • 什么是数据仓库?数据库与数据仓库有什么关系?
  • 消息转换器--通过此工具进行时间转换
  • 7.isaac sim4.2 教程-Core API-数据记录
  • 多态,内部类(匿名内部类),常用API(1)