zoukankan      html  css  js  c++  java
  • MFC中快速应用OpenCV(转)

    转载链接: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的内存泄露问题) 具体请参看下面两幅图所示
    Image:Mfc_opencv_01.JPG
    Image:Mfc_opencv_02.JPG
    就这样子一路下去之后,基本的MFC框架就创建完成了。

     
    加入OpenCV库支持

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

     
    在Doc类中添加变量

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

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

     
    添加虚函数

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

    Image:Mfc opencv 04.jpg

    Image:Mfc opencv 05.jpg

    分别添加函数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类中了。

    Image:Mfc_opencv_08.jpg

     
    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资源
  • 相关阅读:
    各国本地化缩写
    iPhone&iPod Touch定位编写
    NSTimer
    介绍 JSON
    交友社区SEO_SEO工具插件
    交友社区SEO百度的左右智慧
    交友社区SEO_聪明的小贩和邪恶的百度
    IIS7配置管理如何快布署ASP.NET网站
    IIS7配置管理MSDeploy实际应用
    交友社区SEO_网络广告分布
  • 原文地址:https://www.cnblogs.com/mobileliker/p/4121748.html
Copyright © 2011-2022 走看看