MFC中快速应用OpenCV
Wikipedia,自由的百科全书
22:34 2009年4月9日的修订版本 Ollydbg23 (Talk | 贡献) 感谢和后记以及相关讨论 ← Previous diff |
20:05 2009年4月20日的修订版本 Ollydbg23 (Talk | 贡献) 感谢和后记以及相关讨论 - OLE问题 Next diff → |
||
第 82行: | 第 82行: | ||
#在opencv 1.1版本中使用,可能导致MFC的程序无法退出,解决办法请看这里 [http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=5907 程序无法正常退出] | #在opencv 1.1版本中使用,可能导致MFC的程序无法退出,解决办法请看这里 [http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=5907 程序无法正常退出] | ||
#注意,其中的 CImage 其实就是 CvvImage 这两个可以直接替换使用。 | #注意,其中的 CImage 其实就是 CvvImage 这两个可以直接替换使用。 | ||
+ | #OLE错误对话框的问题,请看这里 [http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4707&st=0&sk=t&sd=a&hilit=yahoo+yahoo+groups&start=100#p21185 如何解决OLE的问题的论坛讨论] | ||
==网络其他OpenCV资源== | ==网络其他OpenCV资源== | ||
*在wxWidget GUI 界面中使用 OpenCV的示例 [http://sites.google.com/site/auraliusproject/mango mango编辑器] | *在wxWidget GUI 界面中使用 OpenCV的示例 [http://sites.google.com/site/auraliusproject/mango mango编辑器] | ||
*可以自动产生Opencv代码的 [http://code.google.com/p/cvpreprocessor/ CvPreProcessor] | *可以自动产生Opencv代码的 [http://code.google.com/p/cvpreprocessor/ CvPreProcessor] |
20:05 2009年4月20日的修订版本
目录 |
简介和缘起
本教程原始讨论主题,请见 【原创】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;。
添加虚函数
添加两个函数,分别用来打开图片文件和保存图片文件,添加过程见下图的右键菜单。
分别添加函数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类中了。
感谢和后记以及相关讨论
- 文档由User:Ollydbg23撰写
- 如有疑问,可以去原主题下面发表回复参与讨论 【原创】MFC中快速应用OpenCV教程
- 关于图片太大,无法放入view里的一个解决方案,请看 feixiaolin 的帖子 opencv 数据读写操作+图像噪声+ MFC下OpenCV源代码 以及 如何插入滚动条
- OpenCV绘图函数DrawToHDC的一个简要解释
- 在opencv1.0版本中,使用上面介绍的canny的方法,存在单通道图片无法打开的错误,具体的原因请看这里,这主要是由于opencv1.0中的一个bug所导致的。原因
- 在opencv 1.1版本中使用,可能导致MFC的程序无法退出,解决办法请看这里 程序无法正常退出
- 注意,其中的 CImage 其实就是 CvvImage 这两个可以直接替换使用。
- OLE错误对话框的问题,请看这里 如何解决OLE的问题的论坛讨论
网络其他OpenCV资源
- 在wxWidget GUI 界面中使用 OpenCV的示例 mango编辑器
- 可以自动产生Opencv代码的 CvPreProcessor