本文仅涉及一些核心步骤,具体 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 <opencv\cv.h> #include <opencv\highgui.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

    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...\n");
}
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(, ), Point(-, -));
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 files\microsoft visual studio 10.0\vc\include\stdio.h(234)

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

方法1:

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

在预处理定义的

WIN32

_WINDOWS

_DEBUG下添加_CRT_SECURE_NO_WARNINGS

方法2:

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

#pragma warning(disable:4996)

 

c++ opencv 3.2 +Mfc VS2015窗体显示图片方法的更多相关文章

  1. 我的Android进阶之旅------&gt; Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...

  2. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  3. C++开发人脸性别识别教程(9)——搭建MFC框架之显示图片

    在之前的博客中我们已经实现读取用户选定的目录.并将其路径保存在对应的变量中.在这篇博文中我们将介绍怎样借助CvvImage类将图片显示在picture控件中,并自己主动读取目录下的其它图片. 一.加入 ...

  4. MFC 在对话框显示图片的多种方法

      我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一 ...

  5. MFC 在对话框显示图片的多种方法(四种方法)

    我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基 ...

  6. mfc中循环显示图片

    UINT CPalmIdentDlg::UpdateCImg(LPVOID p) { struct params *pa = (struct params*)p; int *imgarray = pa ...

  7. opencv cv::imageshow 不加waitKey()不能显示图片

    官方解释是highgui 没有给imshow绘制处理的时间.需要在imshow添加waitKey() waitKey()单位是ms

  8. opencv如何在jupyter notebook中显示图片

    方法一: from matplotlib import pyplot as plt import numpy as np import cv2 img = cv2.imread('img.jpg') ...

  9. MFC对话框中显示背景图片

    在MFC对话框中显示图片,四个步骤. 1.首先得在VC6.0或者VS2008(其他版本也是一样)中导入GDI文件.(网上下载:) GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换, ...

随机推荐

  1. CSS3性能体验

    如今许多新技术名词在不断的被提及中,已然向我们靠近.某篮球运动员说了:“变向过人”不是超级明星的专利,也许我也可以试着去做,现在看起来效果还不错...那么,现在我们来体验CSS3:CSS3中的动画功能 ...

  2. Java解决小孩围圈问题

    问题描述:一堆小孩围成一个圈,从第一个小孩开始数,每数到第三个便把第三个孩子删去,数到只剩一个小孩为止,并求该孩子的具体编号. 解决办法 1. package test; public class C ...

  3. VC++ 获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

    1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm ...

  4. 升级tensorflow1.0到1.3,报错ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory Failed to load the native TensorFlow runtime.

    先定位问题,发现在 /usr/local/cuda/include/ /usr/local/cuda/lib64/ 下面只有 libcudnn.so.5 因此,只要下载cudnn6.*版本的文件分别覆 ...

  5. win10虚拟桌面;一不小心按错了突然只剩下桌面,启动的程序都没了

    先说如何关闭虚拟桌面:ctrl+win+F4(万一你还没看到怎么关闭虚拟桌面,就创建并调整到虚拟桌面,会很懵的,因为你启动的所有程序全部都突然消失了,只剩下开机的桌面了): win10有个功能,虚拟桌 ...

  6. python爬取酒店信息练习

    爬取酒店信息,首先知道要用到那些库.本次使用request库区获取网页,使用bs4来解析网页,使用selenium来进行模拟浏览. 本次要爬取的美团网的蚌埠酒店信息及其评价.爬取的网址为“http:/ ...

  7. kafka 删除topic

    两种方法: 一.修改配置文件server.properties 添加如下配置: delete.topic.enable=true 说明:官方给的文档说明“Enables delete topic. D ...

  8. redis异常Redis:java.util.NoSuchElementException: Unable to validate object at

    前两天项目上线的时候遇到了redis的一个问题,在测试环境的时候项目运行正常,项目一上线redis便开始抛异常. redis.clients.jedis.exceptions.JedisConnect ...

  9. 常用官方php版本下载链接

    windows 版本 https://windows.php.net/downloads/releases/archives/ https://windows.php.net/download/#ph ...

  10. python pbr 打包

    在之前学习stevedore时,在setup.py中使用setuptools打包发布了代码,然后调用代码中的实例化对象.参考我的文章 https://www.cnblogs.com/CaesarLin ...