您的位置:首页 > 编程语言 > C语言/C++

c++ opencv 3.2 +Mfc VS2015窗体显示图片方法

2017-07-28 15:18 656 查看
本文仅涉及一些核心步骤,具体OpenCV的配置以及其他的细节问题,请参考VS2010/MFC+OpenCV2.4.1打开图片。

1.新建MFC对话框项目

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

2.配置OpenCV3.2

略,本博客有

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

3.添加和设置控件

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

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

(2)同理,添加PictureControl控件

右击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()成员函数的声明:

voidDrawPicToHDC(IplImage*img,UINTID);


(3)C**Dlg类对应的源文件(**Dlg.cpp)中添加DrawPicToHDC()的实现

voidCMFC_DEMODlg::DrawPicToHDC(IplImage*img,UINTID)
{
CDC*pDC=GetDlgItem(ID)->GetDC();
HDChDC=pDC->GetSafeHdc();
CRectrect;
GetDlgItem(ID)->GetClientRect(&rect);
CvvImagecimg;
cimg.CopyOf(img);//复制图片
cimg.DrawToHDC(hDC,&rect);//将图片绘制到显示控件的指定区域内
ReleaseDC(pDC);
}


(4)为新增按钮的响应函数(OnBnClickedOpenImg)添加代码:

voidCMFC_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]viewplaincopy

//注意:浅拷贝-同样只是创建图像头,而没有复制数据

MatM;

IplImageimg=M;

IplImageimg=IplImage(M);

DrawPicToHDC(image,IDC_STATIC);这个方法需要的是IplImage格式图片文件,而mat文件显示不了的.所以需要转换
所以按钮事件下的代码修改如下:


Matsrc,dst;
src=imread("E:/opencv3.2/TestOpenCVInstall/Debug/openclose.png");
if(!src.data){
printf("couldnotloadimage...\n");
}
namedWindow("inputimage",CV_WINDOW_AUTOSIZE);
imshow("inputimage",src);
charoutput_title[]="morphologydemo";
namedWindow(output_title,CV_WINDOW_AUTOSIZE);

Matkernel=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);

IplImageimg=IplImage(dst);
//image=cvLoadImage("E:/opencv3.2/TestOpenCVInstall/Debug/mmm.jpg",1);//显示图片
DrawPicToHDC(&img,IDC_STATIC);
//TODO:在此添加控件通知处理程序代码


结果最终如下:



若编译出现:

warningC4996:'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.Seeonlinehelpfordetails.
1>c:\programfiles\microsoftvisualstudio10.0\vc\include\stdio.h(234)

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

方法1:

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



在预处理定义的

WIN32

_WINDOWS

_DEBUG下添加_CRT_SECURE_NO_WARNINGS



方法2:

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

#pragmawarning(disable:4996)


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: