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)   

 
原文地址:https://www.cnblogs.com/zuochanzi/p/7250463.html