欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    MATLAB界面编程-.pdf

    • 资源ID:76248758       资源大小:1.08MB        全文页数:19页
    • 资源格式: PDF        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MATLAB界面编程-.pdf

    一个实例搞定MATLAB界面编程作者:彭军邮件:博客:http:/ 界面编程对您而言,就没有什么难度了。当然,我这里说的是,您首先要有一定的MATLAB 编程基础。还有,我的MATLAB 版本是 2008a。在 2008a 以前的版本中没有工具栏编辑器,如果需要工具栏要手动写程序,这个我就不多讲了。好了,废话少说,跟我来吧!在 MATLAB 的命令窗口(Command Window)中运行 guide 命令,来打开GUIDE界面,如下:然后,选择空模板(Blang GUI),点击 OK,即可打开GUIDE的设计界面,如下:点击工具栏上的菜单编辑器(Menu Editor),打开菜单编辑器,如下:在 Menu Bar 中新建一个菜单项,名字为“文件”,其他设置请看下图:在“文件”菜单下添加菜单项:“打开”,“保存”,“退出”。见下图:如果需要在菜单项“退出”上面添加一个分割线的话,选中“Separator above this item”就行了。保存我的界面为pjimage.fig.保存完毕之后,会自动打开pjimage.m 文件,而我们所有的程序都是要写在这个M文件里面的。在编程中,我们的每一个鼠标动作都对应一个Callback函数。那么我们的菜单项也是如此的。在界面上,单击鼠标右键选择“Property Inspector”,即可打开属性窗口。当我们点击不同的控件时,其对应的属性都会在这里显示,我们可以进行修改。最主要的属性莫过于Tag属性和 String属性。设置当前 Figure 窗口的 Tag 属性为:figure_pjimage,窗口的标题(Name属性)为:图像处理实例。如下:然后,点击工具栏的保存按钮。之后,点击工具栏的运行按钮(Run Figure)。注意,工具栏的图标都会有提示的,像运行按钮的提示就是Run Figure.我们会看到如下的界面:那说明,我们保存的.fig文件的目录不是当前目录,但是没关系啊,我们只要点击“Change Directory”来改变当前目录。当然,如果你想把当前目录添加到MATLAB 路径也可以,那就点击“Add to Path”就 OK了。我在这里推荐点击“Change Directory”,因为没有什么太大必要把其添加到MATLAB 路径中,一般是工具箱需要添加或者我们的函数或程序写完了,而在MATLAB 的命令窗口找不到我们的函数的时候,我们可以将函数或程序所在的目录添加到MATLAB 路径。总之吧,点那个按钮,要看个人的爱好了。不管点击 两个按钮的那一个按钮,都会正确 的运行程序的。我们的程序运行时的样子,是这 样 的:文件下面的菜单项和快捷 键我们都 能看到,但是我们没有写程序,所以就算点也没有什么响应。还有如果不想设置快捷 键,可以在Menu Editor中设置,只要把其选择为Ctrl+none就行了,如下:这样 的话,保存项就没有了快捷 键了。我们可以 通过上面的按钮“View”来 查看该菜单项的响 应函数,也就是Callback函数。也可以在pjimage.m 中看,比 如保存的Tag 属性是m_file_save,那么 它对应的 Callback函数的名字就是m_file_save_Callback。依次类 推了。下面我们来写打开菜单项的函数,要打开一个图片,当然要 用打开对话 框了。在界面编程中,打开对话 框的函数是uigetfile.关于 它的详细 的说明 用 help uigetfile命令 查看。下面是打开菜单的 响应函数:function m_file_open_Callback(hObject,eventdata,handles)filename,pathname=uigetfile(.*.bmp;*.jpg;*.png;*.jpeg,Image Files(*.bmp,*.jpg,*.png,*.jpeg);.*.*,All Files(*.*),.Pick an image);保存.m 文件,并 运行程序。点击“文件”下的“打开”,会打开如下的打开对话框:选择一个文件之后,程序中的filename就是你选择的文件的文件名,pathname 就是 该 文件 所 在 的 目 录 的 路 径。比 如:filename=5.jpg,pathname=C:Documentsand SettingsAdministratorMy Documents。那么 获得 路径之后,我们要怎么样才能读入 和显示一个图 片呢?读入 图片可以 用 imread 函数,而显示可以在一个坐标轴上。那么我们需要在界面上画 上一个 坐标轴,为了对 比,我们画两 个坐标轴,一个显示处理前,一个显示处理后的。并且 将处理前的 坐标轴的 Tag属性改为 axes_src,处理后的 坐标轴的 Tag属性为 axes_dst。更改之后,保存。如下:然后在 m_file_open_Callback程序 原来的基础上,再添加如下的程序:axes(handles.axes_src);%用axes 命令设定当前操作的坐标轴是axes_src fpath=pathname filename;%将文件名和目录名组合成一个完整的路径 imshow(imread(fpath);%用imread 读入图片,并用 imshow 在axes_src上显示运行程序,通过“打开”菜单项,打开一个图片。效果如下:那么如 何来保存一 副图片?用 imwrite 命令。但imwrite 命令的 第一个参数就是你读入的图片数据,也就是 imread的返回值。这样的话,我们就要将m_file_open_Callback中的程序做一点 小小的改动。将最后一 句(imshow(imread(fpath),更改为两句,如下:img_src=imread(fpath);imshow(img_src);不仅如此,我们的保存菜单的 Callback 函数,如 何去获得 打开菜单的 Callback函数下的 img_src 变量呢?这里就要将 img_src 来作为一个 共享的数据。许多界面编程的 朋友,喜欢用 global 声明。我个人不 喜欢这样用,因为有 更好的方法。那就是用setappdata 和getappdata 两个函数。我们可以为界面上面的 任何一个具有Tag属性的空 间添加应 用程序数 据。当然我 比较喜欢 将这些共享 的应用程序数 据统一添加到 Figure 窗口上,因为这 样容易记,如果一个控件一个,感觉不容易记。你在.m文件中会 发现除了各个菜单项的 Callback 函数以 外,还有 两个函数: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函数的最后写上如下程序:setappdata(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=uiputfile(*.bmp,BMP files;*.jpg;,JPG files,Pick an Image);if isequal(filename,0)|isequal(pathname,0)return;%“”如果点了取消else fpath=fullfile(pathname,filename);%获得全路径的另一种方法endimg_src=getappdata(handles.figure_pjimage,img_src);%取得打开图片的数据imwrite(img_src,fpath);%保存图片下面是退出菜单项的程序的。要退出界面,只要用 close 函数就行了,但是通常 都会有提示的。比如你如果进行了处理图片,而 又没有保存处理后的图片,那么在关 闭的时候就应 该给出提示,询问 是否 进行保存。不过,在这里,我们先不做这个工作,等后面有需要的时候再写吧。因此,这里的退出菜单项的程序就是一句,如下:close(handles.figure_pjimage);其实,用delete 函数也是可以的,就是:delete(handles.figure_pjimage);看你的 心情 了。但是运行程序的时候,你会发现,当你打开图片的时候,如果点“取消”按钮,那么在MATLAB 的命令窗口会 弹出错误,那是因为我们没有处理取消 的情况。下面我们来处理下这个问题,只要把 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=pathname filename;img_src=imread(fpath);imshow(img_src);setappdata(handles.figure_pjimage,img_src,img_src);下面我们来做一个图像 二值化 的一个图像处理。用上面的 方法添加一个“图像处理”菜单,如下:在其下面添加一个“图像二值化”的菜单项,如下:然后,点击“OK”关 闭菜单编辑器,并保存整个界面。如果我们的.m文件中没有对应的Callback 时,我们可以点击上图中的“View”按钮来 生成一个Callback函数。图像二值化,有一个 阈值的设置,那么我们可以新建一个界面,在这个界面上放一个滑动条来设置图像 二值化 的阈值。同时,有一个文本,显示当前滑动条的值。那么我们新建一个空 白界面,在 它上面画一个Static Text 和Slider 控件,然后 用工具栏的对 齐工具(Align Objects),来对其这 两个空间。如下:然后,将这个界面保存为 im2bw_args.fig。整个设计如下:你可以设置 Static Text 的FontSi ze属性为 10,这 样字体会更大一点。设置Static Text 的Tag属性为txt_display,设置滚动条的Tag属性为slider_val。为了能够在滚动条滚动时,Static Text 显示 滚动条的值,需要在 滚动条的Callback 中写下如下程序,你可以在滚动条上点击右键,选择“View Callbacks”下的“Callback”直接进入滚动条的Callback 函数(slider_val_Callback)。val=get(hObject,Value);set(handles.txt_display,String,num2str(val);保存,运行程序,就可以滑动滚动条,而Static Text 就会显示 相应的值。在figure 上双击打开figure(有方块的底层窗口)的属性窗口,将其 Tag属性设置为“figure_im2bw”,将其 Name 属性设置为“设置图像二值化阈值”。然后,保存界面。运行时,如下:那么,我们想的是,当 滑动条滑动时,将 二值化 的图像显示在 pjimage.fig中的axes_dst 坐标轴上的。那么 怎么办呢?首先,要做的是,当点击 pjimage.fig菜单“图像处理”下的“图像二值化”的时候,会打开 im2bw_args.fig。这个时候就是我们要 调用im2bw_args.m的时候了。当我们 调用它 的时候,会 返回一个句柄,而这个 句柄就是指向打开的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;然后,保存 pjimage.fig.还有就是,最好将 im2bw_args.fig 和pjimage.fig保存在一个目录下面。然后,运行pjimage.fig,可以看到,当点击“图像二值化”的时候会打开 im2bw_args.fig,同时滑动条滑动时也会显示 响应的值。下面来说说如 何在滑动条滑动时,将 滑动后的 二值化图像显示到 pjimage 的axes_dst 坐标轴中。首先,我们要 获得pjimage 的figure 的句柄,这个可以 通过findobj 函数来完 成,之后将 返回值用 guihandles 来转换成 一个句柄。之后,就可以 用这个转化后的句柄来引用pjimage.fig中的任何一个控件了。所以,我们在im2bw_args.fig 下的滑动条的Callback 函数中添加如下函数:h_pjimage=getappdata(handles.figure_im2bw,h_pjimage);axes(h_pjimage.axes_dst);img_src=getappdata(h_pjimage.figure_pjimage,img_src);bw=im2bw(img_src,val);imshow(bw);然后,在 im2bw_args_OpeningFcn中添加:h_pjimage=findobj(Tag,figure_pjimage);h_pjimage=guihandles(h_pjimage);setappdata(handles.figure_im2bw,h_pjimage,h_pjimage);然后,保存,运行。效果如下:但是,如果在我们没有打开图片的情况下,要是点击了“图像 二值化”会出 现什么问题呢?可以看到显示的图像是 全黑的,完 全没有意 义。所以,我们可以在没有点击“打开”菜单项的时候,使“图像处理”菜单不可 用。那么在pjimage.m的OpeningFcn中,添加如下程序:set(handles.m_image,Enable,off);在“打开”菜单项的 Callback 函数的最后,添加如下程序:set(handles.m_image,Enable,on);这样的话,只要你不点“打开”,就不能用“图像处理”菜单中的命令,效果如下:点击“打开”之后,就 能使用 了。下面,我们来说说前面的问题,就是 询问是否保存图片的问题。首先,我们要设置两个标志:一个是图 片是否被处理过了,二是图片是否被保存了。那么我们在pjimage_OpeningFcn中,添加如下的 两个应用程序数据。setappdata(handles.figure_pjimage,bSave,false);setappdata(handles.figure_pjimage,bChanged,false);然后在“图像 二值化”菜单项的 Callback 函数中,改变 bChanged 的值为true,即添加如下程序:setappdata(handles.figure_pjimage,bChanged,true);由于我们要保存的是 坐标轴axes_dst 中的图像,而我们“文件”下的“保存”,实质上保存的是 坐标轴axes_src 中的图像,那 怎么办呢?只好再添加一个“保存”菜单项了。这 次,我们在 坐标轴axes_dst 中添加右键菜单。打开工具栏的菜单编辑器,选择Context Menu(上下文菜单),如下:然后,新建一个 Context Menu,其Tag属性为:axes_dst_menu,如下:然后为其添加菜单项:“保存”,其Tag属性为axes_dst_menu_save.如上图。然后,在 坐标轴axes_dst 上右键,选择“Property Inspector”。将 该坐标轴的UIContextMenu属性更改为a xes_dst_menu.如下图:然后,保存,运行。在a xes_dst 上点右键就 能看到“保存”菜单了。下面来写其函数。filename,pathname=uiputfile(*.bmp,BMP files;*.jpg;,JPG files,Pick an Image);if isequal(filename,0)|isequal(pathname,0)return;else fpath=fullfile(pathname,filename);endimg_dst=getimage(handles.axes_dst);imwrite(img_dst,fpath);setappdata(handles.figure_pjimage,bSave,true);但是你会 发现,没有 读入图片之前,在axes_dst 点右键是有菜单的,一 旦二值化之后,再次点右键就没有菜单了。但是,当我们把右键菜单a xes_dst_menu,添加到figure 窗口(在没有控件的 地方,双击,即可打开 figure 的属性窗口)的UIConte xtMenu的时候,就不会出 现上面的问题,而 且一切运行正常。因为,当你添加到axes_dst 之后,一 旦坐标轴的内容改变,就会将右键菜单 附加到父对象上。因此,如果一定需要在 坐标轴上显示右键菜单,就要 通过程序 创建了。如 何创建,咱们先不说,先说说把 坐标轴axes_dst 保存完毕,退出程序的时候的处理。将原来的m_file_e xit_Callback更改为如下程序:bChanged=getappdata(handles.figure_pjimage,bChanged);%获得是否更改bSave=getappdata(handles.figure_pjimage,bSave);%获得是否保存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(Tag,figure_im2bw);%查找是否打开设置图像二值化参数窗口if isempty(h),%找到的话,则关闭 close(h);endclose(findobj(Tag,figure_pjimage);%关闭主窗口下面来为程序添加一个工具栏,单击工具栏上那个的Toolbar Editor,打开如下:选择“Predefined Tools”下的Open,点击“Add”。再次选择“Save”,点击“Add”。并将Open 按钮的Tag属性 更改为tbl_open,Save按钮的Tag属性 更改为tbl_save,如下:点“View”,来找到 Open 按钮的Callback,在 它的下面来 调用菜单中的打开菜单项的Callback,需要在 Open 按钮的Callback 下写下如下程序:feval(m_file_open_Callback,handles.m_file_open,eventdata,handles);用同样的方法,找到Save按钮的Callback,并在它的下面写上保存程序,但是,我们要 判断一下是不是 第一次保存,如果是,则用保存对话 框;如果不是,我们直接保存在 第一次保存的路径中就可以了。那么,我们还是需要设置 几个应用程序数 据的,第一个就是 记录是否是第一次保存,第二个是记录第一次保存的路径。这 样的话,我们在 pjimage_OpeningFcn中添加如下的 代码:setappdata(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(pathname,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);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 ;另一种是fpath=fullfile(path,filename)。那么fullfile是Matlab为我们提 供的一个函数。判断用户 点击了“确定”还是“取消”按钮,可以看 返回的filename 和pathname是不是为 0。二、读入图片,就是imread函数的 使用。imread函数 读取图片成功 之后,会 返回读取图片的像素矩阵,如果像 素矩阵 是三维的,就 代表这个图 片有三个通道。就像RGB 图片,有R 通道、G 通道和B通道一样。第一个像 素就是每一 维的矩阵的第一个值。三、设置共享数据,就是setappdata 和getappdata 的使用。他们的 第一个参数都是一个控件的 句柄,第二个参数是你要设置或 读取的应用程序数 据的名字。如果是setappdata,那么 第三个参数是你要设置的 值。四、保存图 片,就是imwrite 函数的 使用。其第一个参数是图 片的像素矩阵,也就是imread的返回值,第二个参数就是图 片的完整路径,包括文件名。五、保存对话 框的使用,就是uiputfile函数。使用方法 和uigetfile比较相似。六、输入对话框的使用,就是inputdlg。注意,他的 返回值 是一个Cell 类型的数据,也就是要 通过 来访问他的内部,而不是 矩阵常用 的()。七、菜单编辑器的 使用,包括菜单栏和右键菜单。八、工具栏编辑器的 使用。九、在一个函数的 Callback 函数下,调用另 一个函数。用feval 函数,其 第一个参数是一个函数 句柄,后面是 传递给该 函数的 参数。在界面编程中,hObject 就是当前对 象的句柄,比如pbtn_exit_Callback是一个Tag属性为pbtn_e xit 的按钮的Callback,那么在这个 Callback 里,hObject 就 等价于handles.pbtn_e xit。至于eventdata 是系 统自动管理的,我们不 用去更 改。而handles 则是一个结构体 变量,通过控件的 Tag属性,可以 引用到控件的 句柄。十、两 个GUI 界面之 间如何操作。通过findobj 来查找另一个GUI,然后 用guihandles 将其 转换为可用的GUI句柄。然后,就和在自 己的.m文件里面 使用一样,通过点操作来引用另 一个GUI 的控件,包括读取 其应用程序数 据。十一、可以通过getimage函数来 获取一个坐标轴中当前正在显示的图 片的数据。十二、通 过a xes函数来 切换当前的 坐标轴,也就是要在 哪个坐标轴上画图。十三、获取滑 动条的值。十四、设置静态文本的值。十五、set 和get的使用,这两个是最为 常用的,用来设置或 获取一个控件的 某个属性。好了,就说到这里吧。全是个人的 愚见,有 错误的地方,还望指正。如果对此 篇文章有疑问,请邮件 联系我。要下载此篇文章的例子,请登录我的博客。

    注意事项

    本文(MATLAB界面编程-.pdf)为本站会员(索****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开