ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:1.22MB ,
资源ID:7883253      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7883253.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分别用MFCOpencv库FreeImage库显示同一张BMP图像.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

分别用MFCOpencv库FreeImage库显示同一张BMP图像.docx

1、分别用MFCOpencv库FreeImage库显示同一张BMP图像用VS2008平台设计一个简单的MFC程序,分别用MFC、Opencv库、FreeImage库三种不同的方法来显示同一张BMP图像。1 MFC显示BMP图像(1)MFC插入单张图片1、创建MFC 打开VS2008软件,创建一个MFC对话框应用程序(Dialog-based Application),在名称栏输入创建项目的名称,点击“确定”。如下图所示:在出现的“MFC应用程序向导”对话框内,选择“基于对话框”,并取消“使用Unicode库(N)”其他选项不做修改,单击“下一步”,如下图所示:一直点击“下一步”到“生成的类”对话框

2、,选择基类为“CDialog”单击完成即可创建一个MFC对话框。如下图所示:2、添加控件并导入图片 生成如下图所示的初始的GUI界面,在工具箱中单击“Picture Control”,将鼠标移动到GUI界面内,这样就在此界面添加了一个Picture控件。接着,在“资源视图”下,右击选择“添加资源”,在“添加资源”对话框的“资源类型”下选择“Bitmap”,再单击“导入(M)”,打开BMP图片。如下图所示:3、设置控件 最后在Picture控件的“属性”窗口中将“Type”选择为“Bitmap”类型,将“Image”和“ID”都选择为导入BMP图片的ID,比如IDB_BITMAP1。如下图所示:

3、4、运行程序 最后保存并运行一下程序,成功后将会得到一个含有导入的BMP图像的窗口,完成显示BMP图像的功能,如下图所示:(2)MFC插入多张图片1、添加控件并导入多张图片 当需要插入多张图片时,导入图片的方法同上,然后为每一张图片设置它们的“ID”,例如:IDB_BITMAP1、IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4。在GUI界面中添加一个选择按钮,选择工具箱中的“Combo box”,如下图所示:通过属性窗口修改它的“ID”为“IDC_CHOICE”,“Type”选择“Drop List”,“Owner Draw”选择“No”,在“数据”项中输入每幅图片的名

4、字,每个名字间用分号隔开。2、初始化函数 在“类视图”下,为类“C(工程名)Dlg.h”增加一些私有成员private:CBitmap Bmp1, Bmp2, Bmp3, Bmp4,;从成员变量对话框为“IDC_CHOICE”和“IDC_PICTURE”增加控制变量分别取名为“m_Choice”,“m_Picture”。打开“(工程名)Dlg.cpp”源代码文件里找到OnInitDialog()函数体并将其改成: BOOL Ctext9Dlg:OnInitDialog()CDialog:OnInitDialog(); m_Choice.SetCurSel(0); Bmp1.LoadBitmap

5、(IDB_BITMAP1); Bmp2.LoadBitmap(IDB_BITMAP2); Bmp3.LoadBitmap(IDB_BITMAP3); Bmp4.LoadBitmap(IDB_BITMAP4); return TRUE;3、编写控件事件初始化代码 在“Combo box”控件的“属性”菜单栏中的“控件事件”找到成员函数OnCbnSelchangeChoice(),并为其添加额外的初始化代码:void Ctext9Dlg:OnCbnSelchangeChoice() int CurSel = m_Choice.GetCurSel(); switch( CurSel ) case 0

6、: m_Picture.SetBitmap(Bmp1); break; case 1: m_Picture.SetBitmap(Bmp2); break; case 2: m_Picture.SetBitmap(Bmp3); break; case 3: m_Picture.SetBitmap(Bmp4); break; 4、运行 生成解决方案并运行成功后,会得到一个窗口,通过按钮的下拉菜单可以选择显示不同的图片。2 用Opencv库显示BMP位图1、创建MFC 首先创建一个新的MFC对话框应用程序,在初始的GUI界面添加一个Button和一个Picture控件,在Button控件的属性菜单栏

7、中修改标题“Caption”为“读图”,即此控件的功能是读取图片。将Picture控件的ID号设置为IDC_ShowImg,这个ID号在后面的图像显示函数中会用到。2、 设置程序运行环境 在项目属性中加载lib文件:菜单项目 - 属性- 配置属性 -链接器 输入 - 附加依赖项中加入 cxcore.lib cv.lib highgui.lib。然后在 text.h (工程名为text)的 #include resource.h 下加入如下代码:#include cv.h#include highgui.h#define IMAGE_WIDTH 256#define IMAGE_HEIGHT 2

8、56#define IMAGE_CHANNELS 33、添加控制变量 在类视图面板上右击CtextcDlg,选择添加 添加变量,添加一个 IplImage* 类型的变量 TheImage;再点击 CtextcDlg,在下面窗口的列表中双击 OnInitDialog,在“/ TODO: Add extra initialization here”下面添加 TheImage 的初始化代码:CvSize ImgSize; ImgSize.height = IMAGE_HEIGHT; ImgSize.width = IMAGE_WIDTH; TheImage = cvCreateImage( ImgS

9、ize, IPL_DEPTH_8U, IMAGE_CHANNELS );然后双击 OnPaint,在 if(IsIconic()的 else 里添加以下代码,用来重绘窗口: CDialog:OnPaint();/ 重绘对话框 CDialog:UpdateWindow();/ 更新windows窗口,如果无这步调用,图片显示还会出现问题 ShowImage( TheImage, IDC_ShowImg ); / 重绘图片函数接着在 CmymfcApp 下面的成员列表中双击 InitInstance,在两个“/ TODO: Place code here to handle when the di

10、alog is”下面添加:cvReleaseImage( &dlg.TheImage );即按下“OK”或“Cancel”时,释放TheImage占用的内存。4、 写读取图片的功能函数 回到 text 的 GUI 编辑界面中,右击按钮 “读图”,选择“添加事件处理程序”,建立按钮点击的消息响应程序:句柄名设置为 OnBnClickedReadimg,主要的响应操作包括弹出对话框选择图片文件、读入图片文件、对图片统一缩放至256*256的大小、显示图像,代码如下:CFileDialog dlg( TRUE, _T(*.bmp), NULL, OFN_FILEMUSTEXIST | OFN_PAT

11、HMUSTEXIST | OFN_HIDEREADONLY, _T(image files (*.bmp; *.jpg) |*.bmp; *.jpg | All Files (*.*) |*.*|), NULL );/ 选项图片的约定 dlg.m_ofn.lpstrTitle = _T(Open Image);/ 打开文件对话框的标题名 if( dlg.DoModal() != IDOK )/ 判断是否获得图片 return; CString mPath = dlg.GetPathName(); / 获取图片路径IplImage* ipl = cvLoadImage( mPath, 1 );/

12、 读取图片、缓存到一个局部变量 ipl 中 if( !ipl )/ 判断是否成功载入图片 return; if( TheImage )/ 对上一幅显示的图片数据清零 cvZero( TheImage ); ResizeImage( ipl );/ 对读入的图片进行缩放,使其宽或高最大值者刚好等于 256,再复制到 TheImage 中 ShowImage( TheImage, IDC_ShowImg );/ 调用显示图片函数 cvReleaseImage( &ipl );/ 释放 ipl 占用的内存在“类视图”面板右击 CtextDlg,选择 添加 添加函数,创建两个函数:void ShowI

13、mage( IplImage* img, UINT ID ) 和 void ResizeImage(IplImage* img),此两个函数分别实现图像的读入和显示功能,以下是这两个函数的实现代码:void CmymfcDlg:ResizeImage(IplImage* img)int w = img-width; / 读取图片的宽和高 int h = img-height; / 找出宽和高中的较大值者 int max = (w h)? w: h;/ 计算将图片缩放到TheImage区域所需的比例因子 float scale = (float) ( (float) max / 256.0f )

14、;/ 缩放后图片的宽和高 int nw = (int)( w/scale ); int nh = (int)( h/scale ); / 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值 int tlx = (nw nh)? 0: (int)(256-nw)/2; int tly = (nw nh)? (int)(256-nh)/2: 0; / 设置 TheImage 的 ROI 区域,用来存入图片 img cvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) ); / 对图片 img 进行

15、缩放,并存入到 TheImage 中 cvResize( img, TheImage ); / 重置 TheImage 的 ROI 准备读入下一幅图片 cvResetImageROI( TheImage );void CmymfcDlg:ShowImage( IplImage* img, UINT ID )/ ID 是Picture Control控件的ID号 CDC* pDC = GetDlgItem( ID ) -GetDC();/ 获得显示控件的 DC HDC hDC = pDC -GetSafeHdc();/ 获取 HDC(设备句柄) 来进行绘图操作 CRect rect; GetDl

16、gItem(ID) -GetClientRect( &rect ); int rw = rect.right - rect.left;/ 求出图片控件的宽和高 int rh = rect.bottom - rect.top; int iw = img-width;/ 读取图片的宽和高 int ih = img-height; int tx = (int)(rw - iw)/2; / 使图片的显示位置正好在控件的正中 int ty = (int)(rh - ih)/2; SetRect( rect, tx, ty, tx+iw, ty+ih ); CvvImage cimg; cimg.Copy

17、Of( img );/ 复制图片 cimg.DrawToHDC( hDC, &rect );/ 将图片绘制到显示控件的指定区域内 ReleaseDC( pDC );分析程序功能实现过程:先利用函数GetPathName来获得BMP位图的文件路径,再利用函数cvLoadImage 来获得位图的信息,并用函数cvNamedWindow创建窗口,最后用函数cvShowImage显示位图。在执行完以上操作之后,调试程序,生成如下对话框:单击按钮,添加BMP位图,出现如下对话框,成功地显示了一张BMP位图。3 用FreeImage库显示BMP位图用VS2008建立一个类型为单文档的MFC应用程序,将fr

18、eeimage.lib添加到“项目属性配置属性连接器输入附加依赖项 ”中;将FreeImage中的Dist文件夹添加到“工具选项项目和解决方案VC+目录”中的“包含文件”与“库文件”中;并将#includefreeimage.h添加到头文件stdafx.h中; 1、 Doc头文件设置 (1)在“xxDoc.h”的类声明中添加下列代码:public: FIBITMAP *m_handleFI;virtual BOOL OnOpenDocument(LPCTSTR lpszPathName); (2)在“xxDoc.cpp”文件中将CxxDoc:CxxDoc()改为CxxDoc:CxxDoc():

19、m_handleFI(NULL),即增加一个类型为FIBITMAP *的变量在类(3)在“xxDoc.cpp”文件程序段的末尾处添加BOOL CxxDoc:OnOpenDocument(LPCTSTR lpszPathName) FREE_IMAGE_FORMAT fif; DeleteContents();fif = FreeImage_GetFIFFromFilename(lpszPathName); if( fif != FIF_UNKNOWN ) m_handleFI = FreeImage_Load(fif, lpszPathName); return (m_handleFI!= N

20、ULL); return TRUE;该函数的功能为:先利用函数FreeImage_GetFIFFromFilename来获得BMP位图的文件路径,再利用函数FreeImage_Load来读取位图的信息。)2、VIEW头文件设置在“xxView.cpp”里找到void CxxView:OnDraw(CDC* pDC) (将(CDC* /*pDC*/)改为(CDC* pDC)即可) 这个函数中增加以下代码:pDC-SetMapMode(MM_HIMETRIC); if(!pDoc-m_handleFI) return;double dpiX = FreeImage_GetDotsPerMeterX

21、(pDoc-m_handleFI), dpiY = FreeImage_GetDotsPerMeterY(pDoc-m_handleFI), width = FreeImage_GetWidth(pDoc-m_handleFI), height = FreeImage_GetHeight(pDoc-m_handleFI), sizeX, / 1/100 mm = HIMETRIC sizeY; BYTE *pData = FreeImage_GetBits(pDoc-m_handleFI); if( dpiX=0.0 ) dpiX = 72.0 * 100.0 / 2.54;if( dpiY=

22、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);该函数的功能是:设定位图的高度、宽度以及读取位图像素值信息。3、调试运行程序在执行完以上操作之后,调试程序,生成如下对话框:点击文件打开,插入一张BMP位图,出现如下对话框:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1