opencvMFCFreeImage 三种方法显示图片.docx
- 文档编号:24630130
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:25
- 大小:836.42KB
opencvMFCFreeImage 三种方法显示图片.docx
《opencvMFCFreeImage 三种方法显示图片.docx》由会员分享,可在线阅读,更多相关《opencvMFCFreeImage 三种方法显示图片.docx(25页珍藏版)》请在冰豆网上搜索。
opencvMFCFreeImage三种方法显示图片
桂电信科机器人技术研究中心
实验说明书
题目:
opencv、MFC、FreeImage
三种方法显示图片
系别:
电子工程系
专业:
电子信息科学与技术
学生姓名:
段泽全
学号:
1352400226
指导教师:
王春利
职称:
讲师
题目类型:
理论研究实验研究工程设计工程技术研究软件开发应用研究
摘要
OpenCV是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数字图像和视频处理。
同时利用面向对象的VC++6.0编程工具,用C++语言进行程序编写,大大提高了计算机的运行速度。
MFC(MicrosoftFoundationClasses),是微软公司提供的一个类库(classlibraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
FreeImage是一款免费的、开源的、跨平台(Windows、Linux和MacOSX)的,支持20多种图像类型的(如BMP、JPEG、GIF、PNG、TIFF等)图像处理库。
其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。
FreeImage的主要功能有多格式位图的读写;方便的位图信息获取;位深度转换;位图页面访问;基本的几何变换和点处理;通道合并与混合等。
FreeImage暂时不支持矢量图形和高级图像处理,位图绘制需要由用户来完成。
关键词:
MFC;opencv;freeimage;函数。
目录
1实验目的与任务……………………………………………3
2MFC、opencv、freimage介绍……………………………3
2.1MFC介绍·························3
2.2opencv介绍·······················3
2.3freeimag介绍······················4
3程序·······················5
3.1程序一·························5
3.2程序二·························10
3.3程序三·························20
4实验总结·····················24
1实验目的与任务
1.1熟悉MicrosoftVisualStudio2008的使用方法。
1.2了解MFC、opencv、freeimage的基本内容。
1.3使用MFC、opencv、freeimage的基本函数。
2MFC、opencv、freimage介绍
2.1MFC介绍
MFC:
微软基础类(MicrosoftFoundationClasses),同VCL类似,是一种应用程序框架,随微软VisualC++开发工具发布。
目前最新版本为10.0(截止2011年3月),并且发布了中文版。
该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject直接或间接派生,只有少部分类例外。
MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。
MFC提供了MFCAppWizard自动生成框架。
Windows应用程序中,MFC的主包含文件为Afxwin.h。
此外MFC的部分类为MFC/ATL通用,可以在Win32应用程序中单独包含并使用这些类。
由于它的易用性,初学者常误认为VC++开发必须使用MFC,这种想法是错误的。
作为ApplicationFramework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32程序设计。
2.2opencv介绍
OpenCV的全称是:
OpenSourceComputerVisionLibrary。
OpenCV于1999年由Intel建立,如今由WillowGarage提供支持。
OpenCV是一个基于发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV拥有包括500多个C函数的跨平台的中、高层API。
它不依赖于其它的外部库——尽管也可以使用某些外部库。
OpenCV为Intel®IntegratedPerformancePrimitives(IPP)提供了透明接口。
这意味着如果有为特定处理器优化的IPP库,OpenCV将在运行时自动加载这些库。
2.3freeimage介绍
FreeImage是一款免费的、开源的、跨平台(Windows、Linux和MacOSX)的,支持20多种图像类型的(如BMP、JPEG、GIF、PNG、TIFF等)图像处理库。
其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。
FreeImage的主要功能有多格式位图的读写;方便的位图信息获取;位深度转换;位图页面访问;基本的几何变换和点处理;通道合并与混合等。
FreeImage暂时不支持矢量图形和高级图像处理,位图绘制需要由用户来完成。
FreeImage中的所有函数都以FreeImage_开头,如图像文件的读写函数分别为FreeImage_Load和FreeImage_Save。
FIBITMAP数据结构保存着位图信息和像素数据,是FreeImage的核心。
3程序
3.1程序一
选择“新建”——>“项目”——>“VisualC++”——>“Win32控制台应
用程序”——>名称键入“open_pic1”——>“确定”
选择“下一步”,出现如下窗口。
选择“预编译头”——>“完成”
在Visualstudio中选择“视图”——>“解决方案资源管理器”——>“源文件”
——>“open_pic1.cpp”
把“open_pic1.cpp”内容修改为:
#include"stdafx.h"
#include"highgui.h"
#include"stdio.h"
usingnamespacestd;
usingnamespacecv;
int_tmain(intargc,_TCHAR*argv[])
{
chara[40];
printf("请输入图片路径:
");
LOOP:
scanf("%s",a);
printf("\n");
IplImage*img=cvLoadImage(a);//将路径为“a”的图片加载到内存
if(!
img)//当路径出错或加载图片出错,将跳转至LOOP,重新输入图片路径。
{
printf("路径错误,请输入图片路径:
");
gotoLOOP;
}
else
{
printf("当前图片的路径为:
%s",a);
}
cvNamedWindow("openapicture",CV_WINDOW_AUTOSIZE);
//在屏幕上创建一个窗口"openapicture",显示被包含的图片,窗口的大小会根据图片的大小进行拉伸或缩放。
cvShowImage("openapicture",img);
// 在窗口"openapicture"中显示已加载的图片。
cvWaitKey(0);
//使程序暂停,等待用户触发一个按键操作。
cvReleaseImage(&img);
//释放加载图片所占的内存。
cvDestroyWindow("openapicture");
//销毁窗口"openapicture",并释放窗口所占的内存。
return0;
}
选择“启动调试”,出现如下窗口。
正确键入图片路径即可打开图片。
程序二
选择“新建”——>“项目”——>“VisualC++”——>“MFC应
用程序”——>名称键入“open_pic1”——>“确定”
选择“基于对话框”,并取消“使用Unicode库”
切换到“生成的类”窗口,选择基类为“Copen_pic2Dlg”单击完成即可创建一个MFC对话框。
在工具箱中单击“PictureControl”,将鼠标移动到对话窗口内,这样就在此界面添加了一个控件。
如图。
在“资源视图”下,选择“添加资源”——>“资源类型”——>“Bitmap”——>“导入”,(同时导入多张图片)如下图所示:
Picture控件的“属性”窗口中将“Type”选择为“Bitmap”类型,将“Image”和“ID”都选择为导入BMP图片的ID,如IDB_BITMAP1。
如下图所示:
选择“启动调试”,出现如下对话框。
在对话框中添加一个选择按钮,选择工具箱中的“Combobox”,如下图所示:
通过属性窗口修改它的“ID”为“IDC_CHOICE”,“Type”选择“DropList”,“OwnerDraw”选择“No”,在“数据”项中输入每幅图片的ID,每个ID间用分号隔开。
如图:
右击“picture控件”——>“添加变量”;增加一些私有成员private:
CBitmapBmp1,Bmp2,Bmp3,Bmp4。
重复四次。
将“picture控件”的ID改为“IDC_PICTURE”
右击“picture控件”——>“添加变量”,增加控制变量取名为“m_Picture”。
右击“Combobox”——>“添加变量”,增加控制变量取名为“m_Choice”。
打开“(工程名)Dlg.cpp”源代码文件里找到OnInitDialog()函数体并将其改成:
BOOLCtext9Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
m_Choice.SetCurSel(0);
Bmp1.LoadBitmap(IDB_BITMAP1);
Bmp2.LoadBitmap(IDB_BITMAP2);
Bmp3.LoadBitmap(IDB_BITMAP3);
Bmp4.LoadBitmap(IDB_BITMAP4);
returnTRUE;
}
在“Combobox”控件的“属性”菜单栏中的“控件事件”找到成员函数OnCbnSelchangeChoice(),并为其添加额外的初始化代码:
voidCtext9Dlg:
:
OnCbnSelchangeChoice()
{
intCurSel=m_Choice.GetCurSel();
switch(CurSel)
{
case0:
m_Picture.SetBitmap(Bmp1);
break;
case1:
m_Picture.SetBitmap(Bmp2);
break;
case2:
m_Picture.SetBitmap(Bmp3);
break;
case3:
m_Picture.SetBitmap(Bmp4);
break;
}
生成解决方案并运行成功后,会得到一个窗口,通过按钮的下拉菜单可以选择显示不同的图片。
如图:
3.3程序三
用VS2008建立一个类型为单文档的MFC应用程序,将freeimage.lib添加到“项目属性配置属性连接器输入附加依赖项”中;将FreeImage中的Dist文件夹添加到“工具选项项目和解决方案VC++目录”中的“包含文件”与“库文件”中;并将#include"freeimage.h"添加到头文件stdafx.h中;
在“xxDoc.h”的类声明中添加下列代码:
public:
FIBITMAP*m_handleFI;
virtualBOOLOnOpenDocument(LPCTSTRlpszPathName);
在“xxDoc.cpp”文件中将CxxDoc:
:
CxxDoc()改为CxxDoc:
:
CxxDoc():
m_handleFI(NULL)
在“xxDoc.cpp”文件程序段的末尾处添加
BOOLCxxDoc:
:
OnOpenDocument(LPCTSTRlpszPathName)
{
FREE_IMAGE_FORMATfif;
DeleteContents();
fif=FreeImage_GetFIFFromFilename(lpszPathName);
if(fif!
=FIF_UNKNOWN)
m_handleFI=FreeImage_Load(fif,lpszPathName);
return(m_handleFI!
=NULL);
returnTRUE;}
在“xxView.cpp”里找到voidCxxView:
:
OnDraw(CDC*pDC)
(将(CDC*/*pDC*/)改为(CDC*pDC)即可)这个函数中增加以下代码:
pDC->SetMapMode(MM_HIMETRIC);
if(!
pDoc->m_handleFI)
return;
doubledpiX=FreeImage_GetDotsPerMeterX(pDoc->m_handleFI),
dpiY=FreeImage_GetDotsPerMeterY(pDoc->m_handleFI),
width=FreeImage_GetWidth(pDoc->m_handleFI),
height=FreeImage_GetHeight(pDoc->m_handleFI),
sizeX,//1/100mm==HIMETRIC
sizeY;
BYTE*pData=FreeImage_GetBits(pDoc->m_handleFI);
if(dpiX==0.0)dpiX=72.0*100.0/2.54;
if(dpiY==0.0)
dpiY=72.0*100.0/2.54;
sizeX=1*100.0*1000.0*width/dpiX;
sizeY=1*100.0*1000.0*height/dpiY;//stretched
:
:
StretchDIBits(pDC->m_hDC,1,-1,(int)(sizeX+0.5),-(int)(sizeY+0.5),0,0,(int)(width+0.5),(int)(height+0.5),pData,FreeImage_GetInfo(pDoc->m_handleFI),DIB_RGB_COLORS,SRCCOPY);
调试程序,生成如下对话框:
6实验总结
做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。
在实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这与做其他的实验是通用的,真正使我们受益匪浅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opencvMFCFreeImage 三种方法显示图片 方法 显示 图片