MFC使用OpenCV在文档窗口中显示图像
在VS2010中新建一个 MFC单文档或多文档的应用程序,结合OpenCV强大的图像处理工具,我们可以在MFC的“File/open”直接打开并显示图像,具体方法如下:
(1)首先新建一个单文档或多文档的应用程序,项目名:Demo1
(2)在“Demo1Doc.h ”头文件中包含“#include <opencv2/opencv.hpp>”并声明Mat变量img
(3)在“Demo1Doc.cpp ”实现文件中OnOpenDocument方法中添加读取图片的代码(PS:默认新建MFC程序是没有OnOpenDocument,你可以鼠标右键,选择“类向导”,并搜索添加OnOpenDocument函数即可)
其中TRACE用来在Output窗口打印一些信息,这个在调试时才能看到,为了验证图片解码是否正常,我们把输入图片的长宽打印了出来。
以上两步都是OpenCV主要的代码,要想在MFC中显示Mat矩阵的图像,还需要结合GDI+库,关于GDI+库的使用方法,可以参考网上的资料:http://www.cnblogs.com/pzxbc/archive/2011/11/17/2252490.html
(4)在“Demo1.h ”头文件中包含“#include <gdiplus.h>”和定义GdiplusStartupInput 和ULONG_PTR 属性变量
(5)在“Demo1.cpp ”实现文件中:
在InitInstance 方法中调用:GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);//初始化GDI+库
在ExitInstance方法中调用:GdiplusShutdown(gdiplusToken);//关闭GDI+
(6) 最后在Demo1View.cpp的OnDraw方法中添加显示代码
void CDemo1View::OnDraw(CDC* pDC)
{
CDemo1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
cv::Mat newImage;
if (pDoc->img.channels() == 1)
{
cv::cvtColor(pDoc->img, newImage, CV_GRAY2BGRA);
}
else if (pDoc->img.channels() == 3)
{
cv::cvtColor(pDoc->img, newImage, CV_BGR2BGRA);
}
else
{
newImage = pDoc->img;
}
Gdiplus::Bitmap bitmap(newImage.cols, newImage.rows, newImage.step1(), PixelFormat32bppARGB, newImage.data);
//Gdiplus::Bitmap bitmap(pDoc->img.cols, pDoc->img.rows, pDoc->img.step, //每一行的字节数
// PixelFormat24bppRGB, pDoc->img.data);
Gdiplus::Graphics graphics(pDC->GetSafeHdc());
graphics.DrawImage(&bitmap, 0, 0);
}
(7)设置支持打开的图片格式(如*.jpg;*.bmp) 在“资源视图”中,选择String Table,找到“IDR_Demo1TYPE”,并修改为:
\nDemo1\nDemo1\nDemo1 Files (*.jpg;*.bmp)\n.jpg;.bmp\nDemo1.Document\nDemo1.Document
(8)编译通过后运行,在MFC中点击“文件”→“打开”→选择一个*.bmp或者*.jpg的图片就可以正常显示了。
关于GDI+库的使用方法,可参考网上的资料:
【1】《GDI GDI+从入门到精通》:https://chuanke.baidu.com/v1265063-140266-433487.html
【2】《GDI+开发教程》:https://wenku.baidu.com/view/fc83d137f111f18583d05a3e.html
【3】《GDI+ 使用指南》 http://www.cnblogs.com/pzxbc/archive/2011/11/17/2252490.html