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

发布于:2025-07-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

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函数定义:

//将OpenCV处理的Mat图片格式 转换为MFC的Pictrue Control控件可显示的CImage格式
void CshowRealVideoDlg

网站公告

今日签到

点亮在社区的每一天
去签到