一个实例搞定MATLAB界面编程_第1页
一个实例搞定MATLAB界面编程_第2页
一个实例搞定MATLAB界面编程_第3页
一个实例搞定MATLAB界面编程_第4页
一个实例搞定MATLAB界面编程_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一个实例搞定 MATLAB 界面编程作者:彭军下面请跟我一步一步做一个图像处理的程序,如果您坚持做完这个实例,我想 MATLAB 界面 编程对您而言,就没有什么难度了。当然,我这里说的是,您首先要有一定的 MATLAB 编程 基础。 还有,我的 MATLAB 版本是 2008a。 在 2008a 以前的版本中没有工具栏编辑器,如果需 要工具栏要手动写程序,这个我就不多讲了。好了,废话少说,跟我来吧!在 MATLAB 的命令窗口(Command Window中运行 guide 命令,来打开 GUIDE 界面,如下:然后,选择空模板(Blang GUI,点击 OK,即可打开 GUIDE 的设计界面

2、,如下: 点击工具栏上的菜单编辑器(Menu Editor,打开菜单编辑器,如下:在 Menu Bar 中新建一个菜单项,名字为“文件”,其他设置请看下图:在“文件”菜单下添加菜单项:“打开”,“保存”,“退出”。见下图: 如果需要在菜单项“退出”上面添加一个分割线的话,选中“ Separator above this item”就行了。保存我的界面为 pjimage.fig. 保存完毕之后,会自动打开 pjimage.m 文件,而我们所有 的程序都是要写在这个 M 文件里面的。在编程中,我们的每一个鼠标动作都对应一个 Callback 函数。那么我们的菜单项也是如此的。在界面上,单击鼠标右键

3、选择“Property Inspector”,即可打开属性窗口。 当我们点击不 同的控件时,其对应的属性都会在这里显示,我们可以进行修改。 最主要的属性莫过于 Tag 属性和 String 属性。设置当前 Figure 窗口的 Tag 属性为:figure_pjimage,窗口的标题(Name属性为:图像处 理实例。如下:然后,点击工具栏的保存按钮。 之后,点击工具栏的运行按钮(Run Figure。 注意,工具栏 的图标都会有提示的,像运行按钮的提示就是 Run Figure. 我们会看到如下的界面:那说明,我们保存的.fig 文件的目录不是当前目录,但是没关系啊,我们只要点击 “Chang

4、e Directory”来改变当前目录。当然,如果你想把当前目录添加到 MATLAB 路径也 可以,那就点击“Add to Path”就 OK 了。 我在这里推荐点击“Change Directory”,因为 没有什么太大必要把其添加到 MATLAB 路径中,一般是工具箱需要添加或者我们的函数或程 序写完了,而在 MATLAB 的命令窗口找不到我们的函数的时候,我们可以将函数或程序所在 的目录添加到 MATLAB 路径。总之吧,点那个按钮,要看个人的 爱 好了。 不 管 点击 两 个按钮的那一个按钮,都会 正确 的运 行程序的。我们的程序运行时的 样子 ,是这 样 的: 文件下面的菜单项和 快

5、捷 键我们都 能 看到,但是我们没有写程序,所以就 算 点也没有什么 响 应。还有如果不想设置 快捷 键,可以在 Menu Editor中设置,只要把其选择为 Ctrl +none 就行了,如下:这 样 的话,保存项就没有了 快捷 键了。 我们可以 通 过上面的按钮“ V iew”来 查 看 该 菜单项的 响 应函数,也就是 Callback 函数。也可以在 pjimage.m 中看, 比 如保存的 Tag 属性是 m_file_save, 那么 它 对应的 Callback 函数的名字就是 m_file_save_Callback。 依次类 推了。 下面我们来写打开菜单项的函数,要打开一个图

6、 片 ,当然要 用 打开对话 框 了。 在界面编程中, 打开对话 框 的函数是 uigetfile. 关于 它 的 详细 的说明 用 help uigetfile命令 查 看。下面 是打开菜单的 响 应函数:function m_file_open_Callback(hObject, eventdata, handlesfilename, pathname = uigetfile( .*.bmp;*.jpg;*.png;*.jpeg, Image Files (*.bmp, *.jpg, *.png, *.jpeg; .*.*, All Files (*.*, .Pick an image;保

7、存.m 文件, 并 运行程序。点击“文件”下的“打开”,会打开如下的打开对话 框 : 选择一个文件之后,程序中的 filename 就是你选择的文件的文件名,pathname 就是 该 文 件 所 在 的 目 录 的 路 径 。 比 如 :filename =5.jpg , pathname =C:Documents and Settings Administrator My Documents。那么 获得 路径之后,我们要 怎 么 样才能读入 和显示一个图 片呢?读入 图 片 可以 用 imread 函 数,而显示可以在一个 坐 标 轴 上。 那么我们需要在界面上 画 上一个 坐 标 轴 ,

8、为了对 比 ,我们 画两 个 坐 标 轴 ,一个显示处理前,一个显示处理后的。 并且 将处理前的 坐 标 轴 的 Tag 属性改 为 a x es_src, 处理后的 坐 标 轴 的 Tag 属性为 a x es_dst。 更 改之后,保存。如下:然后在 m_file_open_Callback程序 原 来的基础上, 再 添加如下的程序:axes(handles.axes_src;%用 axes 命令设定当前操作的坐标轴是 axes_src fpath=pathname filename;%将文件名和目录名组合成一个完整的路径 imshow(imread(fpath;%用 imread 读入图

9、片,并用 imshow 在 axes_src上显示运行程序, 通 过“打开”菜单项,打开一个图 片 。 效 果如下: 那么如 何 来保存一 副 图 片?用 imwrite命令。 但imwrite命令的 第 一个 参 数就是你 读入 的图 片 数 据 ,也就是imread的 返回值 。这 样 的话,我们就要将m_file_open_Callback中的程序做一点 小小 的改动。将最后一 句 (imshow(imread(fpath, 更 改为 两句 ,如下:img_src=imread(fpath; imshow(img_src;不 仅 如此,我们的保存菜单的Callback函数,如 何去获得

10、打开菜单的Callback 函数下的img_src变 量呢? 这里就要将img_src来作为一个 共享 的数 据 。 许 多界面 编程的 朋友 , 喜欢用 global 声 明。 我个人不 喜欢 这 样用 ,因为有 更 好的 方法 。 那 就是 用 setappdata和getappdata 两 个函数。 我们可以为界面上面的 任何 一个具有 Tag属性的空 间 添加应 用 程序数 据 。当然我 比较喜欢 将这 些共享 的应 用 程序数 据 统 一添加到Figure窗口上,因为这 样容易记 ,如果一个控件一个, 感觉 不 容易 记 。你在.m文件中会 发现除 了 各 个菜单项的Callback

11、函数以 外 ,还有 两 个函数: pjimage_OpeningFcn和pjimage_OutputFcn.而pjimage_OpeningFcn就 相 当于界 面的 初始化 函数,而pjimage_OutputFcn则 是界面的 输 出函数,也就是当你不运 行fig,而 调用 .m文件时的 返回值 。所以,我们要在pjimage_OpeningFcn中添加如下的程序,来 共享 这个img_src矩 阵 。 代码 如下:setappdata(handles.figure_pjimage, img_src, 0 ;然后,在m_file_open_Callback函数的最后写上如下程序: seta

12、ppdata(handles.figure_pjimage, img_src, img_src;那么,我们在m_file_save_Callback函数中就可以像这 样 的来提 取 img_src,如 下:img_src=getappdata(handles.figure_pjimage, img_src ;那么保存的时候,自然会 用 到保存对话 框 了。要 用 保存对话 框 ,就要 用 到 uiputfile函数了,具 体 的请 用 help uiputfile查 看。那么,保存菜单项下的程序(m_file_save_Callback,可以这 样 写:filename, pathname =

13、 uiputfile(*.bmp, BMP files; *.jpg;, JPG files , Pick an Image;if isequal(filename,0 | isequal(pathname,0return ;%“ ”如果点了 取消elsefpath=fullfile(pathname, filename;%获得全路径的另一种方法endimg_src=getappdata(handles.figure_pjimage,img_src;%取得打开图 片的数据imwrite(img_src,fpath;%保存图片下面是退出菜单项的程序的。要退出界面,只要 用 close函数就行了,

14、但是 通常 都会有提示 的。 比 如你如果进行了处理图 片 ,而 又 没有保存处理后的图 片 ,那么在关 闭 的时候就应 该给 出提示, 询问 是 否 进行保存。 不过,在这里,我们先不做这个工作, 等 后面有需要的时候 再 写吧。因此,这里的退出菜单项的程序就是一 句 ,如下:close(handles.figure_pjimage;其实, 用 delete函数也是可以的,就是:delete(handles.figure_pjimage; 看你的 心情 了。 但是运行程序的时候,你会 发现 ,当你打开图 片 的时候,如果点“ 取消 ”按钮,那么在 MATLAB的命令窗口会 弹 出 错误 ,那

15、是因为我们没有处理 取消 的 情况 。 下面我们来处理下这个 问 题,只要把m_file_open_Callback下面的程序 更 改为如下程序即可:filename, pathname = uigetfile( .*.bmp;*.jpg;*.png;*.jpeg, Image Files (*.bmp, *.jpg, *.png,*.jpeg; .*.*, All Files (*.*, .Pick an image;if isequal(filename,0 | isequal(pathname,0,return ;endaxes(handles.axes_src;fpath=pathna

16、me filename;img_src=imread(fpath;imshow(img_src;setappdata(handles.figure_pjimage,img_src,img_src;下面我们来做一个图像 二值化 的一个图像处理。 用 上面的 方法 添加一个“图像处 理”菜单,如下:在其下面添加一个“图像 二值化 ”的菜单项,如下:然后,点击“OK”关 闭 菜单编辑器, 并 保存 整 个界面。 如果我们的.m文件中没有 对应的Callback时,我们可以点击上图中的“ V iew”按钮来 生成 一个Callback 函数。 图像 二值化 ,有一个 阈值 的设置,那么我们可以新建一个

17、界面,在这个界 面上 放 一个 滑 动 条 来设置图像 二值化 的 阈值 。 同时,有一个文本,显示当前 滑 动 条 的 值 。那么我们新建一个空 白 界面,在 它 上面 画 一个Static Tex t和Slider控 件,然后 用 工具栏的对 齐 工具(Align Objects,来对其这 两 个空 间 。如下:然后,将这个界面保存为im2bw_args.fig。 整 个设计如下:你可以设置Static Tex t的FontSi z e属性为 10,这 样 字 体 会 更 大一点。设置 Static Tex t的Tag属性为t x t_display, 设置 滚 动 条 的Tag属性为sl

18、ider_val。为 了 能够 在 滚 动 条滚 动时,Static Tex t显示 滚 动 条 的 值 ,需要在 滚 动 条 的 Callback中写下如下程序,你可以在 滚 动 条 上点击右键,选择“ V iew Callbacks”下的“Callback” 直接 进 入滚 动 条 的Callback函数(slider_val_Callback。val=get(hObject,Value ;set(handles.txt_display,String ,num2str(val;保存,运行程序,就可以 滑 动 滚 动 条 ,而Static Tex t就会显示 相 应的 值 。在 figure

19、上 双 击打开figure(有 方块 的 底层 窗口的属性窗口,将其Tag属性设置为 “figure_im2bw”,将其Name属性设置为“设置图像 二值化阈值 ”。 然后,保存 界面。运行时,如下:那么,我们想的是,当 滑 动 条滑 动时,将 二值化 的图像显示在pjimage.fig中的 a x es_dst坐 标 轴 上的。那么 怎 么 办呢? 首先,要做的是,当点击pjimage.fig菜 单“图像处理”下的“图像 二值化 ”的时候,会打开im2bw_args.fig。 这个时候 就是我们要 调用 im2bw_args.m的时候了。 当我们 调用它 的时候,会 返回 一个 句柄 , 而

20、这个 句柄 就是 指向 打开的im2bw_args.fig的。关于 更详细 的,你可以 参 看im2bw_args.m文件的最前面的注 释 ,其中有这 样 写:% H = IM2BW_ARGS returns the handle to a new IM2BW_ARGS or the handle to% the existing singleton*.那就说明,我们可以如上的 方式 打开im2bw_args.fig。 所以在“图像 二值化 ”的 Callback函数(m_image_2bw_Callback下,写上如下的程序:h =im2bw_args;下面来说说如 何 在 滑 动 条滑 动

21、时,将 滑 动后的 二值化 图像显示到pjimage的 a x es_dst坐 标 轴 中。首先,我们要 获得 pjimage的figure的 句柄 ,这个可以 通 过findobj函数来完 成 , 之后将 返回值用 guihandles来 转换成 一个 句柄 。 之后,就可以 用 这个 转化 后的 句 柄 来 引用 pjimage.fig中的 任何 一个控件了。所以,我们在im2bw_args.fig下的 滑 动 条 的Callback函数中添加如下函数:h_pjimage=getappdata(handles.figure_im2bw,h_pjimage;axes(h_pjimage.ax

22、es_dst;img_src=getappdata(h_pjimage.figure_pjimage,img_src;bw=im2bw(img_src,val;imshow(bw;然后,在im2bw_args_OpeningFcn中添加:h_pjimage=findobj(T ag , figure_pjimage;h_pjimage=guihandles(h_pjimage;setappdata(handles.figure_im2bw,h_pjimage,h_pjimage;然后,保存,运行。 效果如下: 但是,如果在我们没有打开图 片 的 情况 下,要是点击了“图像 二值化 ”会出 现

23、什么 问 题 呢? 可以看到显示的图像是 全黑 的,完 全 没有意 义 。 所以,我们可以在 没有点击“打开”菜单项的时候, 使 “图像处理”菜单不可 用 。那么在pjimage.m的OpeningFcn中,添加如下程序:set(handles.m_image,Enable , off ;在“打开”菜单项的Callback函数的最后,添加如下程序:set(handles.m_image,Enable , on ;这 样 的话,只要你不点“打开”,就不 能用 “图像处理”菜单中的命令, 效 果 如下:点击“打开”之后,就 能使用 了。下面,我们来说说前面的 问 题,就是 询问 是 否 保存图 片

24、 的 问 题。 首先,我们要设 置 两 个标 志 :一个是图 片 是 否被 处理过了, 二 是图 片 是 否被 保存了。 那么我们在pjimage_OpeningFcn中,添加如下的 两 个应 用 程序数 据 。 setappdata(handles.figure_pjimage,bSave ,false; setappdata(handles.figure_pjimage,bChanged ,false;然后在“图像 二值化 ”菜单项的Callback函数中,改变bChanged的 值 为true,即添加如下程序:setappdata(handles.figure_pjimage,bChan

25、ged ,true;由 于我们要保存的是 坐 标 轴 a x es_dst中的图像,而我们“文件”下的“保存”, 实 质 上保存的是 坐 标 轴 a x es_src中的图像,那 怎 么 办呢? 只好 再 添加一个“保 存”菜单项了。这 次 ,我们在 坐 标 轴 a x es_dst中添加右键菜单。打开工具栏的菜单编辑器,选择Conte x t Menu(上下文菜单,如下: 然后,新建一个Conte x t Menu, 其Tag属性为:ax es_dst_menu,如下: 然后为其添加菜单项:“保存”,其Tag属性为a x es_dst_menu_save.如上图。 然 后,在 坐 标 轴 a

26、 x es_dst上右键,选择“Property Inspector”。将 该坐 标 轴 的 UIConte x tMenu属性 更 改为a xes_dst_menu. 如下图: 然后,保存,运行。 在a x es_dst上点右键就 能 看到“保存”菜单了。下面来写其函数。filename, pathname = uiputfile(*.bmp, BMP files; *.jpg;, JPG files , Pick an Image;if isequal(filename,0 | isequal(pathname,0return ;elsefpath=fullfile(pathname, f

27、ilename;endimg_dst=getimage(handles.axes_dst;imwrite(img_dst,fpath;setappdata(handles.figure_pjimage,bSave,true;但是你会 发现 ,没有 读入 图 片 之前,在a x es_dst点右键是有菜单的,一 旦二值 化 之后, 再次 点右键就没有菜单了。但是,当我们把右键菜单a x es_dst_menu, 添加到figure窗口(在没有控件的 地方 , 双 击,即可打开figure的属性窗口的UIConte x tMenu的时候,就不会出 现 上面 的 问 题,而 且 一 切 运行 正常

28、。 因为,当你添加到a x es_dst之后,一 旦坐 标 轴 的 内 容 改变,就会将右键菜单 附 加到 父 对 象 上。 因此,如果一定需要在 坐 标 轴 上显示 右键菜单,就要 通 过程序 创 建了。如 何创 建, 咱 们先不说,先说说把 坐 标 轴 a x es_dst保存完毕,退出程序的时候的处理。将 原 来的m_file_ex it_Callback更 改为如下程序:bChanged=getappdata(handles.figure_pjimage,bChanged ;%获得是 否更改bSave=getappdata(handles.figure_pjimage,bSave ;%

29、获得是否保存 if bChanged=true & bSave=false,%更改了,而没保存时btnName=questdlg( 您已经更改了图片,但没有保存。要保存吗 ? , 提 示 , 保存 , 不保存 , 保存 ;%用提问对话框switch btnName,case 保存 , %执行 axes_dst_menu_save_Callback的功能feval(axes_dst_menu_save_Callback,handles.axes_dst_menu_save, eventdata,handles;case 不保存 ,%什么也不做endendh=findobj(T ag , figu

30、re_im2bw;%查找是否打开设置图像二值化参数窗口if isempty(h,%找到的话,则关闭 close(h; end close(findobj(Tag,figure_pjimage;%关闭主窗口 下面来为程序添加一个工具栏,单击工具栏上那个的Toolbar Editor,打开如 下: 选择“Predefined Tools”下的Open,点击“Add”。再次选择“Save”,点击 “Add”。并将Open按钮的Tag属性更改为tbl_open,Save按钮的Tag属性更改为 tbl_save,如下: 点“View”,来找到Open按钮的Callback,在它的下面来调用菜单中的打开菜

31、 单项的Callback,需要在Open按钮的Callback下写下如下程序: feval(m_file_open_Callback,handles.m_file_open,eventdata,handle s; 用同样的方法,找到Save按钮的Callback,并在它的下面写上保存程序,但是, 我们要判断一下是不是第一次保存,如果是,则用保存对话框;如果不是,我 们直接保存在第一次保存的路径中就可以了。 那么,我们还是需要设置几个应用 程序数据的,第一个就是记录是否是第一次保存,第二个是记录第一次保存的 路径。这样的话,我们在pjimage_OpeningFcn中添加如下的代码: setap

32、pdata(handles.figure_pjimage,fstSave,true; setappdata(handles.figure_pjimage,fstPath,0; 然后,在Save按钮的Callback下,写下如下的程序: fstSave=getappdata(handles.figure_pjimage,fstSave; if(fstSave=true filename, pathname = uiputfile(*.bmp,BMP files;*.jpg;,JPG files, Pick an Image; if isequal(filename,0 | isequal(pat

33、hname,0 return; else fpath=fullfile(pathname, filename; end img_dst=getimage(handles.axes_dst; imwrite(img_dst,fpath; setappdata(handles.figure_pjimage,fstPath,fpath; setappdata(handles.figure_pjimage,bSave,true; setappdata(handles.figure_pjimage,fstSave,false; else img_dst=getimage(handles.axes_dst

34、; fpath=getappdata(handles.figure_pjimage,fstPath; imwrite(img_dst,fpath; end 并且,我们还需要在没有打开图片之前的“文件”下的“保存”和工具栏的 “Save”按钮都不可用,只有点击“文件”下的“打开”或工具栏下的“打开 ”的时候,它们才可用。那么需要在pjimage_OpeningFcn中添加如下代码: set(handles.tbl_save,Enable,off; set(handles.m_file_save,Enable,off; 并且在m_file_open_Callback下,添加如下代码: set(handles.tbl_save,Enable,on; set(handles.m_file_save,Enable,on; 这样一个小程序,算是完成了。 如果您能按照上面的步骤做完这个小小的程序的话,那么界面编程中的问题你 已经掌握的差不多了。 那么,让我们来总结下你通过上面的小程序都掌握了什么? 一、 打开对话框的使用,就是uigetfile函数的使用。 需要注意的是,获得要打开 的文件的路径时,我们的两种方法:一种是fpath=pathname filename;另一 种是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论