2014-10-12 219 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