【目的】
1、了解OpenCV在MFC框架中的使用,建立基于VC + OpenCV的图像处理平台;
2、在此基础上实现简单的图像处理操作,包括图像的打开、显示、放大、缩小、保存。
【版本】
VC2008 + opencv 2.3.1
【详细实现步骤】
1、VC2008编译环境设置:工程中已预先设好,为保证能编译成功,自己需重新设置(include/lib/bin路径,略。。。);
2、视图显示选择OpenCV老式显示方法CvvImage,将CvvImage文件夹下两个文件加入工程中,stdafx.h中加入【#include "CvvImage/CvvImage.h"】
3、CMFC_OpenCVDoc文档类中加入变量:
Mat m_originImage;//原始图像
Mat m_Image;//中间处理图像
4、重载虚函数OnOpenDocument函数,代码如下:
BOOL CMFC_OpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
//使用Mat矩阵读取图像数据
m_originImage = imread((char*)lpszPathName);
//原始数据留存,数据操作在m_Image上进行
m_originImage.copyTo(m_Image);
return TRUE;
}
5、重载虚函数OnSaveDocument,代码如下:
BOOL CMFC_OpenCVDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
if (!m_Image.empty())
{
imwrite((char*)lpszPathName, m_Image);
}
return TRUE;
}
6、视图类CMFC_OpenCVView中加入变量:
CImage m_showImage;//图像显示变量
7、视图类CMFC_OpenCVView中OnDraw函数改写如下:
void CMFC_OpenCVView::OnDraw(CDC* pDC)
{
CMFC_OpenCVDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if (pDoc->m_Image.empty())
{
return;
}
//获取需要显示的图像
IplImage* piI = &(pDoc->m_Image.operator IplImage());
//转化为合适显示的类型
m_showImage.CopyOf( piI );
//获取显示设备窗口
CRect rect; GetClientRect(▭);
//把显示区的宽度设为图像的真实宽度和高度
rect.right=m_showImage.Width(); //CvvImage:Width()计算图像的宽度,单位像素
rect.bottom=m_showImage.Height();//CvvImage:Height()计算图像的高度,单位像素
//定义一个CSize对象,用于保存滚动条的尺寸,设为图像的真实尺寸
CSize sizeTotal(rect.right,rect.bottom);
SetScrollSizes(MM_TEXT, sizeTotal);//设置滚动条的位置
//调用CvvImage类的成员函数DrawToHDC在视图窗口显示图像
//函数形参为当前的设备环境和显示区大小
m_showImage.DrawToHDC(pDC->GetSafeHdc(),rect);
}
8、滚动条显示设置:
视图类CMFC_OpenCVView需继承于CScrollView类,而不是CView类,需要改动的地方还有,将以下语句
IMPLEMENT_DYNCREATE(CMFC_OpenCVView, CView)
BEGIN_MESSAGE_MAP(CMFC_OpenCVView, CView)
改为:
IMPLEMENT_DYNCREATE(CMFC_OpenCVView, CScrollView)
BEGIN_MESSAGE_MAP(CMFC_OpenCVView, CScrollView);
另外,初始化时重载OnInitialUpdate函数如下:
void CMFC_OpenCVView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: 在此添加专用代码和/或调用基类
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 60;
SetScrollSizes(MM_TEXT, sizeTotal);
}
1