您的位置:首页 > 运维架构

Opencv 基于MFC 显示图片 更改图片分辨率 保存图片 入门操作实例

2016-06-01 22:52 696 查看
Opencv 基于MFC 显示图片 更改图片分辨率 保存图片

本片文章将简单介绍,利用Opencv在MFC框架下,实现①显示图片图像 ,②更改图片图像分辨率,③保存图片的入门操作实例

本文章功能实现依托于MFC的控件进行显示,所以有些变量名是控件的变量名,特此申明以免新手误解。(PS:如果是老手,就直接观看。如果是编程入门级新手,就下载下面那个工程。)

代码实例工程下载(下载之后,需要配置opencv才能生成可执行文件):http://download.csdn.net/detail/i_likechard/9538367

代码exe可执行文件下载(可直接运行,不需安装其它东西):http://download.csdn.net/download/i_likechard/9934294

直接上代码步骤  

1、首先配置Opencv版本环境。我的版本是Opencv2.4.7 好像是这个。如果还没有下载Opencv、配置Opencv。那就先去弄了再来。对于不同版本的Opencv配置方法基本相同。但是难免遇到一些函数参数可能会有不同。

这是我之前配置Opencv后改写的一篇文章,百度链接:http://wenku.baidu.com/view/01c7a2ec580216fc710afd18

2、在 . h 文件中加入

#include "highgui.h"
#include "CvvImage.h"

using namespace cv;
Public:
IplImage *image; //表示原始图片
IplImage *dest;<span style="white-space:pre">	</span>//表示目标图片
CString m_PathName;//用于保存图片路径。


表示调用Opencv中三个类来实现上面的三个功能。并且使用cv的命名空间。3、在 . cpp实现文件中

(1)第一个函数:将pic画在某个控件上。传入img,id。将它单独做成了一个函数用于后面使用

void CopencvcatDlg::DrawPicToHDC( IplImage *img, UINT ID )
{

//HWND h = ::FindWindow(CopencvcatDlg,NULL);
CDC *pDC = GetDlgItem(ID)->GetDC();
HDC hdc=pDC->GetSafeHdc();
/*********************************************************/
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
CvvImage cimg;<span style="white-space:pre">	</span>//实例一个cimg对象
cimg.CopyOf(img,img->nChannels); //Copyof实现把所有通道拷贝(当然也可以选择单通道,这样出来的图片就是黑白了。)
cimg.DrawToHDC(hdc,&rect);
ReleaseDC(pDC);
}
(2)第二个函数用于实现更改图片分辨率(大小)。函数中设置为缩小为原始图像的一半(可更改)

void CopencvcatDlg::OnChangeSizeAndPixel()
{
// TODO: 在此添加控件通知处理程序代码
CvSize size;
double scale = 0.5;
if(image)
{
size.height = image->height*scale;
size.width = image->width*scale;
}
dest=cvCreateImage(size,image->depth,image->nChannels);
cvResize(image,dest,1);
DrawPicToHDC(dest,IDC_STATIC13);//调用第一个函数将缩小分辨率和大小的图像进行控件显示图片
}
(3)第三个函数用于打开文件选择需要显示的图片并进行显示。
void CopencvcatDlg::OnOpenFileAndShowImage()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog picfiledlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"JPG(*.jpg)|*.jpg|位图文件(*.bmp)|*.bmp|", NULL/*AfxGetMainWnd()*/);
if(picfiledlg.DoModal()==IDOK)
{
m_PathName=picfiledlg.GetPathName();.//获取打开文件路径,用于原始图片copy
m_FileName=picfiledlg.GetFileName(); //用于保存更改后的照片

image=cvLoadImage(m_PathName,1); //使用cvLoadImage(),按照路径加载出图片。第二个参数为指定读入图片的深度和颜色
DrawPicToHDC(image,IDC_STATIC12); //调用第一个函数吧原始图像进行选择控件显示
<span style="white-space:pre">		</span>//m_static10.SetWindowTextA(_T("打开文件正常"));
//GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
//GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
//GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);
//GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);
return;
}
else
{
//m_static10.SetWindowTextA(_T("打开文件失败"));
return;
}

}
(4)第四个函数用于保存更改了大小和分辨率的图像

void CopencvcatDlg::OnSaveTheNewImage()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog picfiledlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"JPG(*.jpg)|*.jpg", NULL);
CString str=".jpg";
m_PathName="";
m_FileName="";
if(picfiledlg.DoModal()==IDOK)
{
m_PathName=picfiledlg.GetPathName();
m_PathName+=str;
int x=cvSaveImage(m_PathName,dest,0);
//GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);
if (x!=0)
{
//GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
//GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);
//GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE);
//m_static10.SetWindowTextA(_T("保存正常"));
return;
}
else
{
//m_static10.SetWindowTextA(_T("保存异常了,查一下代码"));
}

}

return;
}


完结撒花。最近居然半夜开始写这种文档了。真是有点疯狂了。哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息