关闭

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

标签: MFCOpencv改变分辨率显示图片改变图片大小
965人阅读 评论(0) 收藏 举报
分类:

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;
}

完结撒花。最近居然半夜开始写这种文档了。真是有点疯狂了。哈哈

4
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26056次
    • 积分:776
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:25篇
    • 译文:0篇
    • 评论:0条
    文章分类