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资源
  • 相关阅读:
    jquery animate()方法 语法
    jquery unload方法 语法
    jquery undelegate()方法 语法
    jquery unbind()方法 语法
    jquery trigger() 方法 语法
    jquery toggle()方法 语法
    jquery change() 函数 语法
    jquery blur()函数 语法
    jquery bind()方法 语法
    jquery checked选择器 语法
  • 原文地址:https://www.cnblogs.com/mobileliker/p/4121748.html
Copyright © 2011-2022 走看看