版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、利用MFC的Picture控件显示和处理图像在OpenCV教程-基础篇的2.8节中,所创建的MFC图像显示是直接放在对话框面板的左上角的,感觉不大美观;MFC中快速应用OpenCV则是介绍用SDI(单文档界面)来显示图像,Astep-by-stepguidetotheuseofMicrosoftVisualC+andtheIntelOpenCVlibrary使用VS2005来进行图像和视频的读取和处理,但是其图像和视频的显示界面不是在对话框里面的,而是新建一个窗口来做。所以下面我们就来看看怎么在对话框里使用Picture控件来显示和处理图像。编辑创建MFC首先创建一个MFC对话框应用程序(Di
2、alog-basedApplication)如下:FCApplicatinnVizard-y*fc2ApplicatknTypeOverviewApplicationTypeCompoundDo匚in已itSupportDocum已ntTemplateStringsDatabasfeSupportUserInterfaceFeaturesApplicationtyp亡:OSingledocument0MultipledocumentsSiaiQg.baseIIUseHTMLdialogProjectstyle:州nd。斛5E如。曰0MFCstandardMultipletop-leveldoc
3、umentsUseofMFC:UseMFCinasharedDLLOUseMFCinastaticlibraryAdvan匚udFeatures匚DcjajmenyViewardiitecturesupportGenerat已HClassesResour匚皂language:英语(美国)UseUnicodelibrariesFinishCancel在VS2005和2008里,我们可以用一个Solution来组合几个Project(每个Project基本上只包含一个Program),当我们要构建一个多Program的应用时(例如一个客户端程序加一个服务器应用程序),利用Solution可以将这些
4、Projects组合起来、并且共享文件和函数库。通常需要为Solution创建一个主路径,其中包含了所有Projects的路径。不过在这篇文章里,我们只构建一个简单的Project,所以在创建MFC的NewProject对话框里,不用勾选Createdirectororsolutic这个选项。点击OK-Next进入下一步,在这里我们创建一个Dialog-basedApplication,大部分选项按默认设置就行,不过最下面的UseUnicodelibraries最好去掉。如果勾选了这个选项,程序代码就会使用16bit的Unicode字符集来编码,但是很多函数虽然使用char*(ASCIIsti
5、ngs)类型字符,而将字符串从Unicode转换到ASCII是非常麻烦的。使用Unicode在编译时可能会遇到下列错误:cannotconvertparameter1fromCStringtoconstchar*cannotconvertfromconstchar11toLPCWSTR这意味着在Unicode和Multi-byte字符串的转换中出现了问题。在上一篇学习笔记中,就提到成员函数LoadBMP其输入参数类型应为contca,那应该只是一个治标的方法,这里的去掉UeUnicodeliba选硕,才是治本之道。往后的几步设置,可以根据自己的需要来操作,我的设置如下:编辑编写代码在Resou
6、rceView面板-mymfc(工程名称)-mymfc.rc-Dialog双击IDD_MYMFC_DIALOG,可以看到一个初始的GUI界面,往里面添加两个Button和一个Picture控件,如下:选中单个控件、右击选择属性(Properties),可以看到控件的ID号,这个号可以自行编辑,例如Picture控件的ID号我设置为IDC_ShowImg,这个ID号在后面的图像显示函数中要用到。首先在项目属性中加载lib文件:菜单Project-Properties-ConfigurationProperties-LinkerInput-additionaldependencies中加入cxco
7、re200ibcv200ibhighgui200.lib。然后在mymfc.h的#includeresource.h下加入如下代码:#includecv.h#includehighgui.hI#defineIMAGEWIDTH256#defineIMAGE_HEIGHT256#defineIMAGECHANNELS3i在ClassView面板右击CmymfcDIg,选择AddAddVariable,添加一个IplImage*类型的变量TheImage;再点击CmymfcDlg,在下面窗口的列表中双击OnInitDialog,在TODOAddextrainitialiationhere下面添加T
8、heImage的初始化代码:CvSizeImgSize;ImgSize.height=IMAGE_HEIGHT;ImgSize.width=IMAGE_WIDTH;TheImage=cvCreatelmage(ImgSize,IPL_DEPTH_8U,IMAGE_CHANNELS);然后双击OnPaint,在ifIslenic的else里添加以下代码,用来重绘窗口:CDialog:OnPaint();/重绘对话框CDialog:UpdateWindow();/更新windows窗口,如果无这步调用,图片显示还会出现问题Showimage(Thelmage,IDC_ShowImg);/重绘图片函
9、数接着在CmymfcApp下面的成员列表中双击InitInstanee,在两个TOOPlacecdeherethandlehenthedialgis下面添加:cvReleaselmage(&dlg.Thelmage);即按下0或Canee时,释放TheImage占用的内存。接下来就是写读取和处理图片的功能函数了。回到mymfc的GUI编辑界面中,右击按钮ReadImg,选择AddEventHandler,建立按钮点击的消息响应程序:1YlBCN_DROPDOWNBCNHOTITErlCHANGE9WelcometotheEventHandlerWizardCommandnameiDCRendI
10、mgClasslist:Messag已t?pe:Fun匚百口仃handlername:OnBnClickedReadimgHandlerdescription:IndicatestineuserdickedabuttonAddandEditCancelBNCLICKEDCAboutElgUi删句柄名设置为OnBnClickedReadimg,主要的响应操作包括弹出对话框选择图片文件、读入图片文件、对图片统一缩放至256*256的大小、显示图像,代码如下:/TODO:Addyourcontrolnotificationhandlercodehere/选项图片的约定CFileDialogdlg(T
11、RUE,_T(*.bmp),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T(imagefiles(*.bmp;*.jpg)|*.bmp;*.jpg|AllFiles(*.*)|*.*|),NULL);/打开文件对话框的标题名dlg.m_ofn.lpstrTitle=_T(OpenImage);J./判断是否获得图片if(dlg.DoModal()!=IDOK)return;I/获取图片路径CStringmPath=dlg.GetPathName();/读取图片、缓存到一个局部变量ipl中IplImage*ipl=cvLo
12、adImage(mPath,1);/判断是否成功读取图片if(!ipl)|return;/对上一幅显示的图片数据清零if(TheImage)cvZero(TheImage);I/对读入的图片进行缩放,使其宽或高最大值者刚好等于56,再复|制到TheImage中TOC o 1-5 h zI;ResizeImage(ipl);/调用显示图片函数IIShowImage(TheImage,IDCShowImg);i/释放ipl占用的内存iicvReleaseImage(&ipl);其中包含了两个新的成员函数ResizeImage和Showimage,前者的作用是对读入的不同大小的图像进行缩放,再通过设
13、置ROI的方式将图像存入256*256的TheImage中;后者是将图像TheImage显示到图片显示控件IDC_ShouImg窗口的正中部位。为了实现这两个功能,首先在ClassView面板右击CmymfcDIg,选择AddAddFunction,创建两个函数:voidShowlmage(IplImage*img,UINTID)和voidResizelmage(lpllmage*img)。以下是这两个函数的实现代码:rIIIvoidCmymfcDlg:ResizeImage(IplImage*img)|/读取图片的宽和高intw=img-width;inth=img-height;/找出宽和
14、高中的较大值者Iintmax=(wh)?w:h;iI/计算将图片缩放到Thelmage区域所需的比例因子jfloatscale=(float)(float)max/256.0f);iii/缩放后图片的宽和高intnw=(int)(w/scale);intnh=(int)(h/scale);i1iII/为了将缩放后的图片存入Thelmage的正中部位,需计算图片在Thelmage左上角的期望坐标值inttlx=(nwnh)?0:(int)(256-nw)/2;Iinttly=(nwnh)?(int)(256-nh)/2:0;ITOC o 1-5 h zI/设置Thelmage的ROI区域,用来存
15、入图片imgcvSetImageROI(TheImage,cvRect(tlx,tly,nw,nh);iIIi/对图片img进行缩放,并存入到TheImage中|IcvResize(img,TheImage);/重置TheImage的ROI准备读入下一幅图片IIcvResetImageROI(TheImage);i1iiivoidCmymfcDlg:ShowImage(IplImage*img,UINTID)/ID是PictureControl控件的ID号II/获得显示控件的DCCDC*pDC=GetDlgItem(ID)GetDC();/获取HDC(设备句柄丿来进行绘图操作HDChDC=pD
16、C-GetSafeHdc();CRectrect;GetDlgltem(ID)GetClientRect(&rect);/求出图片控件的宽和高intrw=rect.right一rect.left;intrh=rect.bottom一rect.top;/读取图片的宽和高intiw=img-width;intih=img-height;/使图片的显示位置正好在控件的正中inttx=(int)(rw-iw)/2;intty=(int)(rh-ih)/2;SetRect(rect,tx,ty,tx+iw,ty+ih);/复制图片CvvImagecimg;cimg.CopyOf(img);/将图片绘制到
17、显示控件的指定区域内cimg.DrawToHDC(hDC,&rect);ReleaseDC(pDC);函数Resizeimage是参考了学习笔记(5)中单窗口显示多幅图像的函数cvShowMultilmages修改而成的,函数Showimage则是参考了帖子OpenCV如何把图像显示到MFC的picture控件上的代码,另外下面几个帖子也可以参考:1、MFCpicturecontrol画框的问题2、MFCpicturecontrol控件实现(隐藏)文字显示3、MFC在PictureControl中显示图片(jpg)遇到的问题4、vc怎样在picturecontrol中显示jpg,jif,bmp
18、格式图象5、使用PictureControl显示BMP图片最后是要对读入的图像做简单的Canny边缘处理,为此,建立一个按钮EdgeDetect,相应的响应代码如下:voidCmymfcDlg:OnBnClickedEdgedetect()i“/TODO:AddyourcontrolnotificationhandlercodehereIplImage*gray=0,*edge=0;|gray=cvCreatelmage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),|TOC o 1-5 h zjIPL_DEPTH_8U,1);|edge=cvCreatelmage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),iIIPL_DEPTH_8U,1);;cvCvtColor(TheImage,gray,CV_BGR2GRAY);cvCanny(gray,edge,30,100,3);!cvCvtColor(edge,TheImage,CV_GRAY2BGR);!IShowImage(TheImage,IDC_ShowImg);/调用显示图片函数IIcvReleaseImage(&gray);cvReleaseImage(&edge);这里主要是参考了0penCV教程-基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石河子大学《语言程序设计》2021-2022学年期末试卷
- 石河子大学《双碳概论》2023-2024学年第一学期期末试卷
- 石河子大学《工程项目管理》2022-2023学年第一学期期末试卷
- 石河子大学《材料力学》2023-2024学年第一学期期末试卷
- 九年级数学专题总复习(含答案)
- 沈阳理工大学《力学》2021-2022学年第一学期期末试卷
- 沈阳理工大学《机电传动控制》2022-2023学年期末试卷
- 四史2023-2024-2学期学习通超星期末考试答案章节答案2024年
- 沈阳理工大学《动态网络广告》2022-2023学年期末试卷
- 关于合同法的专著
- Access数据库课程标准
- 幼儿园中班语言:《两只蚊子吹牛皮》 课件
- 临时用电漏电保护器运行检测记录表
- 头痛的国际分类(第三版)中文
- 音乐ppt课件《小小的船》
- 幼儿园教学课件语言教育《雪地里的小画家》
- 结构化面试经典100题及答案
- ESG引领下的西部城市再出发-新型城市竞争力策略研究白皮书
- 小学生班干部竞选自我介绍PPT模板公开课一等奖市赛课获奖课件
- 万科物业岗位说明书2
- 音乐教学说课
评论
0/150
提交评论