最近在做一个图像视频处理的小软件,需要用到opencv,但是既然是软件,就要方便他人使用,而opencv自带的GUI显然不太好用,于是就想到用MFC做一个界面,(之前是想用QT做界面的,因为MFC做的界面实在不好看,而且不能跨平台,只能在windows里面用,但是之前没接触过QT,时间又比较紧,于是乎就先用MFC了)!所以现在先做一个小例子展现一下怎么用opencv在MFC中显示一张图片。

首先在VS2012中新建一个MFC工程


点击“下一步”


选择 “基于对话框”


把 “最大化框”“最小化框”勾上


点击 “完成”


可以看到界面的编辑窗口了


把在编辑框中原有的控件删除,在工具栏中选中Button控件和Picture Control控件,分别添加按钮和图片显示框


打开Button控件的属性框,将控件名字改为“打开图片”

同理打开Picture Control控件属性框,将Type改为Rectangle类型


到现在为止,基本界面已经做好,接下来要讲代码了


opencv配置的问题网上挺多,在这里我就不详细讲了,可以参考Opencv + vs2012环境配置

但是要将opencv中的图片显示在MFC窗口,必须得包含一个CvvImage类,这个类在opencv2.2以前版本是有的,但之后的版本没有了,(小编觉得opencv都已经放弃了,是不是MFC已经没多少人用了),不过现在先不管这些,要在MFC中显示opencv的图片,就得用到这个类,下载地址为CvvImage,然后将h文件和cpp文件加入到MFC工程里面,如下图所示:


然后双击Button控件添加代码

void CShowImageMFCDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	using namespace cv;

	IplImage *image=NULL; //原始图像

	if(image) 
		cvReleaseImage(&image);

	image = cvLoadImage("E:\\PS素材\\中大南校.jpg",1); //显示图片,路径自己测定

	DrawPicToHDC(image, IDC_STATIC);
}
同时记得在上面(即CShowImageMFCDlg.cpp)包含这两个头文件

#include "opencv2/opencv.hpp"
#include "CvvImage.h"
这时候会发现函数DrawPicToHDC是没有的,这个函数的功能就是将图片显示在MFC窗口上,就是上面说过的需要用到CvvImage这个类,函数DrawPicToHDC如下,把它写在Button控件的下面即可

void CShowImageMFCDlg::DrawPicToHDC(IplImage *img, UINT ID){
	CDC *pDC = GetDlgItem(ID)->GetDC();
	HDC hDC= pDC->GetSafeHdc();
	CRect rect;GetDlgItem(ID)->GetClientRect(&rect);
	CvvImage cimg;
	cimg.CopyOf( img ); // 复制图片
	cimg.DrawToHDC( hDC, &rect ); // 将图片绘制到显示控件的指定区域内
	ReleaseDC( pDC );
}
最后不要忘记在头文件即CShowImageMFCDlg.h中声明一下函数DrawPicToHDC,注意头文件中也要#include“opencv2/opencv.hpp”

最后编译运行,结果如下图

点击“打开图像”按钮,即可打开图像,其中图像路径是写进程序中的,大家可以将它改写成点击按钮后选择打开文件的路径的打开方式来打开图像文件。

以前没有用过opencv的时候想在MFC打开一幅JPEG图片,后来发现MFC里面只支持打开微软的图片格式BMP,(现在都什么年代了,谁不是用JPEG图片啊,你还只支持BMP,有木有啊有木有,BMP还不压缩的,一张图片占多大的空间啊,有木有啊有木有)所以通过上面的方法是可以打开任何类型的图片的。(只要是opencv支持的图片都能打开,话说opencv专业搞图像视频几十年,一般图像还是都能打开的,要是找到打不开的图片格式,十有八九是你自己创的图片格式)

至于在MFC上面显示视频的话,应该也是类似的,毕竟视频就是一秒钟之内显示25幅图,至于要怎么实现,尽请期待........

更多推荐