有时为了简单的演示,经常需要使用到mfc和opencv。现在就记录一下二者一起使用。

一,先打开VS2015,建立一个MFC工程,名字为opencv_mfc,选择对话框类型,其余按默认操作来就行。

##例如对Button按键和显示图片控件进行显示一张图像操作:

然后打开资源视图的对话框栏,在对话框中添加控件。把原来的默认的两个按钮都删了,添加一个图片Control,ID为IDC_PIC,再添加一个按钮控件,ID为IDC_BTN_OPEN,标题为“打开图片”完成以上步骤得下图:

opencv 按键值_控件

 

二,切换到解决方案资源管理器,在opencv_mfcDlg.h中添加以下头文件和声明文件:

在工程属性中新建opencv属性表,配置包含路径和库路径。

在xxDlg.cpp中包含opencv头文件:

#include "opencv2/opencv.hpp"
using namespace cv;

以上为OpenCV中的头文件,接着添加一个成员变量,主要是为了获取图片控件的尺寸:

CRect rect;

三,在opencv_mfcDlg.cpp源文件中的的OnInitDialog()函数中添加自定义代码如下:

//----------------------------【自定义代码处】--------------------------------------
	CWnd  *pWnd1 = GetDlgItem(IDC_PIC);//CWnd是MFC窗口类的基类,提供了微软基础类库中所有窗口类的基本功能。
	pWnd1->GetClientRect(&rect);//GetClientRect为获得控件相自身的坐标大小
	namedWindow("src1", WINDOW_AUTOSIZE);//设置窗口名
	HWND hWndl = (HWND)cvGetWindowHandle("src1");//hWnd 表示窗口句柄,获取窗口句柄
	HWND hParent1 = ::GetParent(hWndl);//GetParent函数一个指定子窗口的父窗口句柄
	::SetParent(hWndl, GetDlgItem(IDC_PIC)->m_hWnd);
	::ShowWindow(hParent1, SW_HIDE);
	Mat srcImg = imread("bk.jpg");
	resize(srcImg, srcImg, Size(rect.Width(), rect.Height()));
	imshow("src1", srcImg);
//----------------------------【自定义代码处】--------------------------------------

简单的来说,就是首先得到图片控件的大小,然后用namewindow函数创建一个窗口,然后得到其句柄,将其与图片控价相关联。后面又显示了一幅图片,如果不在初始化里显示这幅图片,程序运行开始,图片控件那里有深灰色的阴影,所以加了一张浅色的照片。(这一步不是必须的)

四,为按钮添加消息响应函数直接在对话框的资源视图中右击按钮添加消息响应函数,代码如下:

void CcvMFCDlg::OnBnClickedBtnOpen()
{
	// TODO: 在此添加控件通知处理程序代码
	TCHAR szFilter[] = _T("图片文件 (*.jpg)|*.jpg|All Files (*.*)|*.*||");
	// 构造打开文件对话框   
	CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
	CString strFilePath;
 
	// 显示打开文件对话框   
	if (IDOK == fileDlg.DoModal())
	{
		// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
		strFilePath = fileDlg.GetPathName();
		USES_CONVERSION;
		char *s = T2A(strFilePath);
		Mat srcImg = imread(s);
		resize(srcImg, srcImg, Size(rect.Width(), rect.Height()));
		imshow("src1", srcImg);
	}
}

步骤三不加载bk.jpg时窗口时下面这样,图片区域有阴影,步骤三最后三行代码使用了跟背景一致的图片遮盖了阴影。

opencv 按键值_文件对话框_02

加载一张图片后的效果:

opencv 按键值_opencv 按键值_03

 

参考:MFC和openCV连用显示图片

参考:关于找不到cvGetWindowHandle()的解决方法

参考:【在 MFC 框架中,OpenCV与MFC窗口绑定方法】

遇到问题:

1、cvGetWindowHandle() is undefined

解决办法:添加上

#include<opencv2/highgui/highgui_c.h>