在 Matlab 中,自己的函数将图像从循环中的 Gui 动态加载/显示到轴中



使用指南,我制作了一个具有 10 个轴的 Matlab Gui,我想在其中显示图像,在按下按钮后,一次在所有轴中显示图像。

我制作了一个单独的 .m 文件,其中包含我从按钮回调调用的函数Load_Write_Img_Results(img_index),其中包含以下代码:

for i = 1 : 10
    handles_imgOut = findobj('Tag', ['imgOut' num2str(i)]);
    set(handles_imgOut, 'HandleVisibility', 'ON');
    axes(handles_imgOut);
    image(imgs_data{img_index(i)});
    ...
end

每次我运行主 Gui 并第一次按下按钮时,图像都会显示在所有轴上,所以一切正常


当我第二次按下按钮时出现问题,并收到此错误:

    Error using axes  
    Invalid object handle

在这一行上:

    axes(handles_imgOut);

调试时,我看到handles_imgOut = findobj('Tag', ['imgOut' num2str(i)]);handles_imgOut没有得到任何值并且是的,所以很明显这个错误。

有没有可能在第二次按下按钮时无法获得轴的手柄?

另外,我想知道如何解决来自 Matlab 的此警告:

Calling AXES(h) in a loop can be slow. Consider moving the call to AXES outside the loop.

提前感谢,欢迎任何建议!


[解决方案]:

for i = 1 : 10
    handles_imgOut = findobj('Tag', ['imgOut' num2str(i)]);
    set(handles_imgOut, 'HandleVisibility', 'ON');
    axes(handles_imgOut);
    image(imgs_data{img_index(i)});
    set(gca, 'Tag', ['imgOut' num2str(i)]); //! renew the tag
    ...
end

我对 GUIDE 相当陌生,我遇到了类似的问题,图表没有更新多次/找不到轴。最后,我使用了以下方法,希望对您也有帮助:

    % I get my axes directly from the handles object, instead of using findObj:
        graph1 = handles.axes1;
        graph2 = handles.axes2;
    % clear axes
        cla(graph1);
        cla(graph2);
    % showTrial is my function that draws the graphs - 
    %notice that I used handles to store other variables as well (.data, .trials)
    showTrial(handles.data, handles.trials(1), graph1, graph2)

总结一下:

  • 不要使用 findObj,从句柄中获取轴(它应该自动将它们包含为 imgOut1、imgOut2 等)

  • 将轴传递给绘图函数或直接传递手柄变量,例如 Load_Write_Img_Results(img_index,手柄)

它在第一次按下按钮时起作用,但此后不工作的事实暗示

image(imgs_data{img_index(i)});

打开新轴,而不是绘制到现有轴中。由于新轴未使用您的标签初始化,因此findobj找不到它们。也

(1) 确保在创建轴后立即放置hold on命令来握住原始轴,

(2) 在image命令后立即更新标签

set(gca, 'Tag', ['imgOut' num2str(i)]);

最新更新