这几天开始学习OpenCV的,不过OpenCV的做图形界面太简陋,于是决定用MFC和OpenCV的做,在MFC中调用OpenCV的显示图片。
参考:https://blog.youkuaiyun.com/u010623565/article/details/54574488
运行环境:VS2015 + openCV3.4.3,配置的话可以去看看浅墨大神的博客和书籍。
一,先打开VS2015,建立一个MFC工程,名字为cvMFC,选择对话框类型,其余按默认操作来就行。
然后打开资源视图的对话框栏,在对话框中添加控件。把原来的默认的两个按钮都删了,添加一个图片Control,ID为IDC_PIC,再添加一个按钮控件,ID为IDC_BTN_OPEN,标题为“打开图片”完成以上步骤得下图:
二,切换到解决方案资源管理器,在cvMFCDlg.h中添加以下头文件和声明文件:
#include<opencv2\opencv.hpp>
using namespace cv;
以上为OpenCV中的头文件,接着添加一个成员变量,主要是为了获取图片控件的尺寸:
CRect rect;
三,在cvMFCDlg.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);
}
}
利用MFC的文件对话框获取图片的地址,然后将CString转换成char *类型,传给imread即可打开任意图片。
五,运行结果:
源文件下载:https://download.youkuaiyun.com/download/xsgaaa/10790790