手寫數字識別問題(2)——利用matlab搭建GUI界面

經過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!大功告成。如有不足,請評論告知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章