2014-10-12 99 views
0

我一直試圖在瀏覽它後顯示圖像。但是,我一直在收到如下錯誤:在gui中的Matlab顯示圖像

???引用不存在的字段'axes1'。 Error ==> ImGui> Browse_Callback at 19 axes(handles.axes1) ???錯誤,同時評估uicontrol回調

我已經嘗試使用兩個預定義軸[像'axes(handles.axes1);']以及後定義[像'imshow(imgorg,'父',句柄。 axes1);']。不幸的是,這兩種技術都不適合我,我一直堅持使用軸。我也嘗試製作一個定製的座標軸並使用它,但它也未能在圖上顯示我的圖像。任何人都可以在我的代碼中找出/糾正問題:

function ImGui 
    f =figure('Visible','on','Position',[460,200,700,385]); 
    BrowseBt = uicontrol('Style','pushbutton',... 
       'String','Browse','Position',[600,350,70,25],... 
       'Callback',@Browse_Callback); 
    dispnames = uicontrol('Style','text','String','',... 
      'Position',[50,350,400,20]); 
    movegui(f,'center'); 

    function Browse_Callback(hObject, eventdata, handles) 

     handles.output = hObject; 
     [FileName,PathName] = uigetfile('*.jpg;*.png','Select an image file',... 
            'C:\Users\owner\Downloads\Conjunctiva\SGRH'); 

     fpname = strcat(PathName,FileName); 
     dispnames = uicontrol('Style','text','String',fpname,... 
      'Position',[50,350,400,20]); 
     imgorg = imread(fpname); 

     handles.output = hObject; 
     guidata(hObject, handles); 
     axes(handles.axes1); 
     imshow(imgorg); 
%  ImAxes = axes('Parent', f, ... 
%     'Units', 'normalized', ... 
%     'position',[50 50 400 250]); 
%    'HandleVisibility','callback', ... 
%  imshow(imgorg, 'Parent', handles.axes1); 
%  imshow(imgorg, 'Parent', handles.ImAxes); 
    end 
end 

回答

1

使用guidata函數。
和重組你的代碼一點點

您定義所有的uicontrols(按鈕,文本框,軸等)和分配他們的句柄結構(稱爲handles這裏)。然後當GUI完全定義時,請致電guidata將此句柄結構存儲在任何回調可以訪問的位置。

然後在你的回調函數中,再次調用guidata來檢索這個句柄結構並訪問你的對象(你的軸和你的文本框)。

function ImGui 
    f =figure('Visible','on','Position',[460,200,700,385]); 
    handles.BrowseBt = uicontrol('Style','pushbutton',... 
       'String','Browse','Position',[600,350,70,25],... 
       'Callback',@Browse_Callback); 
    handles.dispnames = uicontrol('Style','text','String','',... 
      'Position',[50,350,400,20]); 
    handles.ImAxes = axes('Parent', f, ... 
      'Units', 'pixels', ... 
      'position',[30 30 640 300],... 
      'visible','off'); 
    movegui(f,'center'); 
    guidata(f,handles) ; 

    function Browse_Callback(hObject, eventdata) 
     handles = guidata(hObject); 

     [FileName,PathName] = uigetfile('*.jpg;*.png','Select an image file'); 
     fpname = strcat(PathName,FileName); 

     imgorg = imread(fpname); 

     set(handles.dispnames,'String',FileName) 
     set(handles.ImAxes,'visible','on') ; 
     imshow(imgorg, 'Parent', handles.ImAxes); 
     guidata(hObject, handles); 
    end 
end 

在這種特定的情況下,你並不真的需要在回調再次存儲值的末尾再次調用guidata但它是很好的做法,在修改過的東西,你要保存的變化情況。

+0

謝謝Hoki。有效。需要一個小小的改進,我應該怎麼做才能使ImAxes只有在Gui上顯示圖像時纔可見? – Hasan 2014-10-12 11:54:02

+0

@Hasan。我編輯了答案。創建時只需將「visible」屬性設置爲「off」,然後只在需要時才顯示它。 – Hoki 2014-10-12 12:06:41

+0

這太棒了。現在會導致另一個問題:我必須將Browse_Callback函數中讀取的圖像傳遞給另一個函數。我試圖這樣做,我創建另一個按鈕,並在其點擊後,我必須將圖像傳遞到下一個函數: handles.AnalyzeBt = uicontrol('Style','pushbutton',... 'String ','分析',... 'Callback',@ Analyze_Callback); guidata(hObject,handles); 函數Analyze_Callback(hObject,eventdata,imgorg) handles = guidata(hObject); rim = imgorg(:,:,1); – Hasan 2014-10-12 12:23:40