最近由于要做项目所以做可视化界面,在网上查询了半天时间发现大部分MFC和OpenCV联合开发的案例都是基于OpenCV3.0以前,较为新的版本较少或者制作过程不清楚。为此本人将自己查阅资料写的基于VS2017的MFC平台与OpenCV4.0.1联合小案列写出来供大家参考,赠人玫瑰,手留余香,希望大家多多批评和指正。话不多说,直接上干货。
【1】测试效果图(点击显示图片就可以从文件夹中显示一张图片出来)
【2】实现过程及代码(vs2017和OpenCV4.0.1)
程序思想:
注解:namedWindow生成两个窗口:子窗口、父窗口
(1)把namedWindow创建的子窗口的大小调整为和图片控件大小一样
(2)获得namedWindow创建的父窗口:为了把该父窗口隐藏,用::ShowWindow(hParent, SW_HIDE);
(3)获得namedWindow创建的子窗口:为了把子窗口的父窗口设置为picture控件,即把图片显示在控件上,用SetParent函数。
(4)加载图片并显示:imread、imshow。
(1)创建MFC文档及可视化界面的初步设计
(2)可视化界面的初步设计(控件:一个button和一个picture contro)
(3)更改控件的ID
(3)代码的编辑
头文件设置 找到MatshowimageDlg.h添加以下代码
注意一定要添加 :#include "opencv2/highgui/highgui_c.h"
#include <iostream>
#include<opencv2/core.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <opencv.hpp>
#include<string>
using namespace std;
using namespace cv;
初始化设置 找到MatshowimageDlg.cpp添加一下代码
namedWindow("view", WINDOW_AUTOSIZE);
HWND hWnd = (HWND)cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_PIC_STATIC)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
图像处理代码 找到MatshowimageDlg.cpp添加一下代码
CString picPath; //定义图片路径变量
CFileDialog dlg(TRUE, "*.*", "*.*", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif|bmp文件(*.bmp)|*.bmp|文件(*.*)|*.*|", NULL);
if (dlg.DoModal() == IDOK)
{
picPath = dlg.GetPathName(); //获取图片路径
}
//CString to string 使用这个方法记得字符集选用“使用多字节字符”,不然会报错
string picpath = picPath.GetBuffer(0);
Mat image = imread(picpath);
Mat imagedst;
//以下操作获取图形控件尺寸并以此改变图片尺寸
CRect rect;
GetDlgItem(IDC_PIC_STATIC)->GetClientRect(&rect);
Rect dst(rect.left, rect.top, rect.right, rect.bottom);
resize(image, imagedst, Size(rect.Width(), rect.Height()));
imshow("view", imagedst);
【3】最终效果展示
【4】总结
MFC结合OpenCV过程中有很多问题 都需要不断的调试 本来MFC的学习就是一件特别痛苦的事 但是未来可期 继续努力。