zoukankan      html  css  js  c++  java
  • c++ opencv 3.2 +Mfc VS2015窗体显示图片方法

    本文仅涉及一些核心步骤,具体 OpenCV 的配置以及其他的细节问题,请参考 VS2010 / MFC + OpenCV 2.4.1打开图片

    1. 新建 MFC 对话框项目

    基于对话框,不使用Unicode库,在静态库中使用MFC,完成

    2. 配置 OpenCV 3.2

    略, 本博客有

    opencv 3. 2的配置相较 OpenCV 2 在依赖项的添加上会简略很多。

    3. 添加和设置控件

    • (1)菜单,视图,工具箱,打开工具箱 ⇒ 添加 Button 控件;

      右击添加的按钮,属性,将其 Caption 改为 OpenImg;

    • (2)同理,添加Picture Control控件

      右击 Picture 控件,属性,打开控件属性窗口,其 ID 为 IDC_STATIC,修改Type 为 Rectangle,将 Picture 控件大小调整合适(用于最终图像的显示)。

    • (3)右击按钮,添加事件处理程序

      选择BN_CLICKED,类列表为CMFC_DEMODlg(交由 Dialog 类捕获按钮单击消息),函数名为OnBnClickedOpenImg,添加编辑

    4. 添加 OpenCV 的 CvvImage 文件(.h, .cpp)

    CvvImage.h 下载地址:CvvImage.h 
    CvvImage.cpp 下载地址:CvvImage.cpp

    https://github.com/yuhuazou/StereoVision    感觉这个 文件很重要, 同样的环境换这里 的两个文件,就没问题了 

    【头文件】(右键)⇒ 添加现有项 ⇒ CvvImage.h 
    【源文件】(右键)⇒ 添加现有项 ⇒ CvvImage.cpp

    5. 添加代码

    • (1)打开 C**Dlg 类对应的头文件(**Dlg.h)的起始位置处添加:

      
      #include <opencvcv.h>
      
      
      #include <opencvhighgui.h>
      
      
      #include "CvvImage.h"
      
    • (2)在 C**Dlg 类的声明中添加 DrawPicToHDC()成员函数的声明:

      void DrawPicToHDC(IplImage *img, UINT ID);
    • (3)C**Dlg 类对应的源文件(**Dlg.cpp)中添加 DrawPicToHDC() 的实现

      void CMFC_DEMODlg::DrawPicToHDC(IplImage *img, UINT ID)
      {
          CDC *pDC = GetDlgItem(ID)->GetDC();
          HDC hDC= pDC->GetSafeHdc();
          CRect rect;
          GetDlgItem(ID)->GetClientRect(&rect);
          CvvImage cimg;
          cimg.CopyOf( img ); // 复制图片
          cimg.DrawToHDC( hDC, &rect ); // 将图片绘制到显示控件的指定区域内
          ReleaseDC( pDC );
      }
    • (4)为新增按钮的响应函数(OnBnClickedOpenImg)添加代码:

      void CMFC_DEMODlg::OnBnClickedOpenImg()
      {
          // TODO: 在此添加控件通知处理程序代码
          IplImage *image=NULL; //原始图像
          if(image) cvReleaseImage(&image);
          image = cvLoadImage("D:\demo.jpg",1); //显示图片
          DrawPicToHDC(image, IDC_STATIC);
      }

    6. 编译运行,大功告成

    上边的代码只是打通了按钮显示图片的功能和opencv 与窗体框架融合不存问题,实际还需要 

    一下:Mat转IplImage

    [cpp] view plain copy
     
      1. //注意:浅拷贝 - 同样只是创建图像头,而没有复制数据  
      2. Mat M;  
      3. IplImage img = M;  
      4. IplImage img = IplImage(M);  
      DrawPicToHDC(image, IDC_STATIC); 这个方法需要的是IplImage  格式图片文件,而mat文件显示不了的.所以需要转换
    所以按钮事件下的代码修改如下:
        Mat src, dst;
            src = imread("E:/opencv3.2/TestOpenCVInstall/Debug/openclose.png");
            if (!src.data) {
                printf("could not load image...
    ");
            }
            namedWindow("input image", CV_WINDOW_AUTOSIZE);
            imshow("input image", src);
            char output_title[] = "morphology demo";
            namedWindow(output_title, CV_WINDOW_AUTOSIZE);
        
            Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
            morphologyEx(src, dst, CV_MOP_OPEN, kernel); //开操作
            /*morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);*/
            //morphologyEx(src, dst, CV_MOP_TOPHAT, kernel);
            imshow(output_title, dst);
        
        // TODO: 在此添加控件通知处理程序代码
        IplImage *img = NULL; //原始图像
        if (img) cvReleaseImage(&img);
    
        IplImage img = IplImage(dst);
    //    image = cvLoadImage("E:/opencv3.2/TestOpenCVInstall/Debug/mmm.jpg", 1); //显示图片
        DrawPicToHDC(&img, IDC_STATIC);
        // TODO: 在此添加控件通知处理程序代码

    结果最终如下:

    若编译出现:

    warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>          c:program filesmicrosoft visual studio 10.0vcincludestdio.h(234) 

    的错误:这 是个日志帮助文件出现的错误:

    方法1: 

    找到Debug属性页C/C++下得预处理器

    在预处理定义的

    WIN32

    _WINDOWS

    _DEBUG下添加_CRT_SECURE_NO_WARNINGS

    方法2: 

    在*dlg.h 最上部加入下边的过滤这个错误就可以了

    #pragma warning(disable:4996)   

     
  • 相关阅读:
    打造颠覆你想象中的高性能,轻量级的webform框架---js直接调后台的封装(第三天)
    打造颠覆你想象中的高性能,轻量级的webform框架---js直接调后台(第二天)
    打造颠覆你想象中的高性能,轻量级的webform框架-----如何替换webform的垃圾控件(第一天)
    数据设计总结
    经典HTML5小游戏 支持各种浏览器 (围住神经猫)
    jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)
    jquery 直接调用 wcf,面向服务的SOA架构 ( 第三天)
    jquery 直接调用 wcf,面向服务的SOA架构 ( 第二天)
    常见面试之机器学习算法思想简单梳理
    2014-03-29.阿里实习生招聘笔试题目
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/7250463.html
Copyright © 2011-2022 走看看