转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV

简介和缘起

本教程原始讨论主题,请见 【原创】MFC中快速应用OpenCV教程,制作此教程的目的,就是为了方便广大windows下面使用MFC的用户可以轻松的在MFC窗口View类中,实现OpenCV格式图片的显示。

 
介绍基本的openCV和MFC的操作
 
在MFC中如何应用菜单,和Canny算子的实例
 
创建SDI工程

我使用的是Visual C++ 6.0,因此,本教程描述的是在VC6上面演示操作,如果您使用别的版本的VC,我想应该也差不多。 首先,按照VC的向导,产生一个默认的MFC的工程,注意,选择SDI单文档支持的,同时最好选择“use MFC As a static library”(防止MFC中使用OpenCV的内存泄露问题) 具体请参看下面两幅图所示


就这样子一路下去之后,基本的MFC框架就创建完成了。

 
加入OpenCV库支持

现在加入openCV必须的头文件和库文件。如下图所示,我们添加库文件: cxcore.lib cv.lib highgui.lib 

 
在Doc类中添加变量


找到 ***Doc 也就是文档类的定义,在开头加上 HighGui.h 的头文件包含, 同时添加一个变量CImage m_image;

注意,如果你使用的不是VC6,按照我的教程,可能编译无法通过(我的教程中,对 m_image 是设置成 protected类型的),解决的办法是将 m_image的类型设置为public,以后建议大家都使用public修饰符。 具体的bug报告和分析请看这里:建议使用public修饰符

 
添加虚函数

添加两个函数,分别用来打开图片文件和保存图片文件,添加过程见下图的右键菜单。

分别添加函数OnOpenDocument 和 OnSaveDocument 如下面的代码

BOOL CSDI OpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName){
if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;
// TODO: Add your specialized creation code here
m_image.Load(lpszPathName);
return TRUE;
}
BOOL CSDI OpenCVDoc::OnSaveDocument(LPCTSTR lpszPathName){
// TODO: Add your specialized code here and/or call the base class
m_image.Save(lpszPathName);
return TRUE;
// return CDocument::OnSaveDocument(lpszPathName);
}

注意,上面本来是 return CDocument::OnSaveDocument(lpszPathName); 但是后来发现有问题,保存了图片,会导致保存后的图片的大小变成0了,改用 return TRUE;就没有问题了,具体请看论坛的讨论:http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4932&p=18215#p18215

 
在View类中添加显示图像代码

在View类中间添加必要的图片显示代码,主要是在Ondraw里面。

void CSDI_OpenCVView::OnDraw(CDC* pDC)
{
CSDI_OpenCVDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CImage & img = pDoc ->m_image;
CRect r;
GetClientRect (&r);
img.DrawToHDC(pDC->GetSafeHdc() ,r);
}

编译整个程序,就可以通过“打开菜单”打开图像并且显示在MFC的View类中了。

 
2010-12-28重要更新

由于OpenCV2.2里面,把原来的CvvImage整个类给删除掉了,因此在MFC下使用带来诸多不方便,大家可以通过提前opencv2.1中的代码的方法来解决(弄一个h文件和一个cpp文件,然后放到你的项目里面一起编译就可以了)。具体的方法和文件内容,请看: Re: OpenCV2.2里CImage(CvvImage)取消,MFC下显示图片少了个好方法

 
感谢和后记以及相关讨论
  1. 文档由User:Ollydbg23撰写,另外,我整理的本论坛精华区,也是以wiki的形式,放在这里论坛精华区
  2. 如有疑问,可以去原主题下面发表回复参与讨论 【原创】MFC中快速应用OpenCV教程
  3. 关于图片太大,无法放入view里的一个解决方案,请看 feixiaolin 的帖子 opencv 数据读写操作+图像噪声+ MFC下OpenCV源代码 以及 如何插入滚动条
  4. OpenCV绘图函数DrawToHDC的一个简要解释
  5. 在opencv1.0版本中,使用上面介绍的canny的方法,存在单通道图片无法打开的错误,具体的原因请看这里,这主要是由于opencv1.0中的一个bug所导致的。原因
  6. 在opencv 1.1版本中使用,可能导致MFC的程序无法退出,解决办法请看这里 程序无法正常退出
  7. 注意,其中的 CImage 其实就是 CvvImage 这两个可以直接替换使用。
  8. OLE错误对话框的问题,请看这里 如何解决OLE的问题的论坛讨论
 
网络其他OpenCV资源

MFC中快速应用OpenCV(转)的更多相关文章

  1. MFC中快速应用OpenCV教程

    论坛上看到非常经典的VS2008 + OpenCV 2.0下的配置过程: (这里用的是opencv2.0) 1. 文件 | 项目 | MFC | MFC应用程序 |(新名称如MFCtest)|next ...

  2. VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)

    在上一篇中介绍了几个写入注册表数据和读取注册表数据的接口,并介绍了使用方法. 这一片教你如何使得你的应用程序在下次打开时保持上一次关闭前的状态. 在上一篇添加的代码的基础上,要添加WM_CLOSE消息 ...

  3. 多线程编程之二 ---MFC中的多线程开发

    下载源代码 五.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消 ...

  4. MFC中的乱起八糟----字符编码:LPTSTR,LPCTSTR, TCHAR等

    注意,编写有 Unicode 意识的代码总是一件好事,比如: CString graycat = CString(_T("Gray")) + _T("Cat") ...

  5. 【opencv入门篇】 10个程序快速上手opencv【下】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) 上篇传送:http: ...

  6. 【opencv入门篇】 10个程序快速上手opencv【上】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...

  7. 在MFC中添加OpenGL窗口

    虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了...   一.首先介绍Windows图像程序设计中几个重要的概念:   G ...

  8. MFC中文件对话框类CFileDialog详解及文件过滤器说明

    当前位置 : 首页 » 文章分类 :  开发  »  MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为 ...

  9. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

随机推荐

  1. [Ramda] Basic Curry with Ramda

    var _ = R; /***************************************** C U R R Y I N G E X A M P L E **************** ...

  2. yii2 model源码解读

    模型yii\base\Model 模型主要实现了验证规则和验证器确保输入的数据是安全和正确的. 模型的流程: 1.从请求中读取数据.使用load或者loadMultiple或者手动赋值.load会根据 ...

  3. 日志分析(三) kibana数据展示

    kibana最新版本支持自定义数据大盘了,今天试用了下,感觉非常棒.上图: 支持多维度定义视图,然后视图里面可以依据粗粒度维度进行图表归类.总之,比旧版本强大太多了.后面试试能否扩展加入耦合一定业务数 ...

  4. Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

    Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它 ...

  5. [课程相关]homework-01

    我的github博客大概是一年前创建的.现在已经想不起来当时是怎么接触到github的了,大概是从某一个网站看到的吧.注册完帐号以后很长一段时间都没有真正的去使用github,主要原因就是网站是英文的 ...

  6. HDU 4433 locker

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4433 这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A) ...

  7. MySQL 更改默认编码为 utf8 (转)

      转自blog.sina.com.cn/s/blog_4c451e0e0100vefm.html 1.打开MySQL安装目录找到 my.ini,如:C:\Program Files\MySQL\My ...

  8. LeetCode 226

    Invert Binary Tree Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 /** ...

  9. [改善Java代码]适当设置阻塞队列长度

    阻塞队列BlockingQueue扩展了Queue,Collection接口,对元素的插入和提取使用了"阻塞"处理,我们知道Collection下的实现类一般都采用了长度自行管理方 ...

  10. hdu1501 动态规划

    这题有两种解题思路,一个是记忆化搜索,一个是dp. 分别贴代码: 记忆化搜索: #include<iostream> #include<cstdio> #include< ...