经过GUI的学习(详见博客:https://blog.csdn.net/didi_ya/article/details/105357279
),小白逐渐了解了MATLAB的GUI界面及其搭建。下面是我自己搭建的手写数字识别GUI界面。
单一数字识别
多数字识别
下面进行一下详细介绍。具体各个按钮和Tag键的含义这里就不详细介绍了,详见:MATLAB之GUI界面介绍与搭建
这里主要介绍一下句柄调用,多菜单使用以及其他操作。
菜单1——单一数字识别
1.按钮创建及回调
.m文件中原始函数函数不做任何改变,在GUI界面中新建四个按钮,右键“查看回调”——>“callback”,进入按钮的函数体内,
这样就可以当按下按钮pushbutton1时,打开图像了。
其他按钮的回调函数设置与其类似,这里不再赘述,需要注意的是:
由于后面的回调需要用的图像I,因此,在该函数内加一条语句,使其变成全局变量:
global I
(注:按钮名称的修改为双击按钮,修改其FondSize和String即可)
2.坐标轴创建及回调
GUI界面中创建坐标轴,如图所示:
其显示界面如图所示:
那么如何将其坐标轴都隐藏掉呢?
这里,介绍一下,
首先,双击打开“XTickLabel”、“YTickLabel”,
将内容全部删除。然后将“XColor”、“YColor”设置成白色。
ok,完成。
3.按钮与坐标轴联合
既然我的pushbutton1读取了图像,那么我想要显示图像。如果不进行任何操作,你就会发现,坐标轴与按钮不同步。那么,如何将坐标轴设置与按钮同步呢?
这里在pushbutton1中加入语句:
axes(handles.axes1)
如图,
ok!
4.清除按钮
这里我设置了清除按钮,清除按钮的作用是:
清除掉读取的图片,清除掉显示的图像及数字等等。
清除按钮的语句为:
try
delete(allchild(handles.text1));
delete(allchild(handles.axes1));
delete(allchild(handles.axes2));
set(handles.text1,'String','');%设置字符串text1为空
end
text1是这里的静态数字——“识别数字”
“识别结果”为“面板”,可在右边找到。
5.退出按钮
退出按钮用于退出系统,语句为:
close(gcf);
6.多菜单栏
点击“菜单编辑器”即可进入。
在这里,可以设置标签,标记,启用此项,等等。如下图所示。
点击回调——>查看,即可查看.m文件中的回调函数。
7.创建菜单2的一些项
同样在原始GUI界面上进行创建,不过,要把Visable选项改为“off”,如下图所示。
其他按钮和坐标轴创建与上述类似。
创建完成后,你会发现,GUI界面混乱不堪,不要着急,慢慢整理。
首先,进入菜单栏的回调函数,进行设置。
在Untitled_1_Callback中,将想要在界面1中显示的设置为on,将想要在界面2中显示的设置为off
如图所示:
而Untitled_2_Callback恰恰相反,
这样就可以做到,点击菜单1即可显示想要在菜单1中显示的内容了。
将所有都完后,大概示意图如图所示:
这时,会发现一个问题:
你如果打开了一张图像,然后再点击另一个菜单,这张图像不会消失,而是会一直在GUI界面上显示。要解决这一问题,必须在菜单栏回调函数后加几行语句,进行删除,
如在Untitled_1_Callback后加
try
delete(allchild(handles.Multi));
delete(allchild(handles.Multi_yu));
delete(allchild(handles.a));
delete(allchild(handles.b));
delete(allchild(handles.c));
delete(allchild(handles.d));
delete(allchild(handles.text6));
end
这样,我的Untitled_1_Callback如下:
function Untitled_1_Callback(hObject, eventdata, handles)
h1=[handles.pushbutton1 handles.pushbutton2 handles.pushbutton3 handles.pushbutton4 handles.Original_Image handles.Image_Preprocessing handles.uipanel1 handles.text1];
set(h1,'Visible','on');
h2=[handles.pushbutton5 handles.pushbutton6 handles.pushbutton7 handles.pushbutton8 handles.pushbutton9 handles.Multi handles.Multi_yu handles.uipanel2 handles.text2 handles.text6];
set(h2,'Visible','off');
try
delete(allchild(handles.Multi));
delete(allchild(handles.Multi_yu));
delete(allchild(handles.a));
delete(allchild(handles.b));
delete(allchild(handles.c));
delete(allchild(handles.d));
delete(allchild(handles.text6));
end
这样就可以及时把想要删除的东西去掉。
还有一个地方没有讲到——数据传递
set(handles.text2,'String',endresult);%将endresult赋值给handles.text2
guidata(hObject,handles);%保存handles结构体
这条语句用于给静态文本赋值,并保存handles结构体(在我的程序中,用于给识别后的数字赋值并保存)
ok!大功告成!
下面展示一下我的GUI界面:
单一数字识别:
多数字识别:
okkk!大功告成。如有不足,请评论告知。