【问题标题】:Matlab: How to display Matrix as Image in GUIMatlab:如何在 GUI 中将矩阵显示为图像
【发布时间】:2016-10-22 23:52:33
【问题描述】:

我正在使用 Matlab 开发我的第一个 GUI。它会变得有点大,但我开始非常基础。到目前为止,我只有一个按钮和轴。

我正在循环一个矩阵,该矩阵每次通过循环时都会更新。我想在我的 GUI 中显示这个矩阵。

当我取出“axes(handles.axes1)”时,我的 GUI 将关闭,并打开一个新窗口,其中包含我想要在我的 GUI 上显示的图片。当我把它留在里面时,我得到的是错误:

引用已清除的变量句柄。

RackWriter 中的错误>onOff_Callback(第 141 行)

轴(handles.axes1)

gui_mainfcn 中的错误(第 95 行)

    feval(varargin{:});

RackWriter 中的错误(第 42 行)

gui_mainfcn(gui_State, varargin{:});

错误 @(hObject,eventdata)RackWriter('onOff_Callback',hObject,eventdata,guidata(hObject)) 评估 DestroyedObject 回调时出错

有人知道我做错了什么吗?

提前非常感谢

这是矩阵的创建方式以及我打算如何展示它:

        % Reshape data (1D -> 2D array)

data2d = zeros(nrow, ncol);

k = 1;

for i = 1:nrow

   for j = 1:ncol

      data2d(row_index(i), col_index(j)) = data(k);

      k = k + 1;

   end

end


%resize 16x10 image to 160x100 image

data2d_resized = imresize(data2d,10);

%sensetivity

axes(handles.axes1)

imshow(data2d_resized,[0 255]);

【问题讨论】:

  • 你在某个地方给clear handles打电话吗?
  • 没有。我应该在代码的开头这样做吗?
  • 否,但错误消息明确指出handles 是一个已清除的变量,这意味着当您尝试使用它时无法访问它。
  • 你是如何运行你的 gui 的?你是在文件资源管理器中双击它吗?如果是这样,请尝试通过在 matlab 命令窗口中写入其名称来运行它
  • 我还在开发中,所以我总是从 matlab 中的运行命令启动它

标签: image matlab loops user-interface matrix


【解决方案1】:

这应该可以解决问题:

    handles.figure = imshow(data2d_resized, [0 255], 'parent', handles.axes1);

如果你想在后期更新你的身材,你可以使用:

    set(handles.figure, 'CData', updated_matrix);

另外,请确保在代码中的每个函数之后放置下一行,它会更新句柄:

    guidata(hObject,handles);

【讨论】:

  • 首先感谢。它显示与“handles.figure = imshow(data2d_resized, [0 255], 'parent', handles.axes1);”相同的错误这次。要清楚你看到的代码是在一个while循环中。所以图像每次都会更新。为什么它会关闭我的 GUI,打开一个新窗口并显示我想在我的 GUI 上看到的图像?
  • 我从来没有遇到过这个错误。我假设while循环发生在回调函数之一中?您是否删除了axes(handles.axes1)
  • 是的,是的......如果你愿意,我可以把我的整个代码放在这里
  • 这可能很有用,如果它不是太长的话
  • 不应该没问题。我通过串行端口从矩阵传感器读取数据。我将从 matlab 中取出所有预先添加的 cmets.. 一秒钟
【解决方案2】:
    function varargout = RackWriter(varargin)
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @RackWriter_OpeningFcn, ...
                       'gui_OutputFcn',  @RackWriter_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end

    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT


    % --- Executes just before RackWriter is made visible.
    function RackWriter_OpeningFcn(hObject, eventdata, handles, varargin)

    % Choose default command line output for RackWriter
    handles.output = hObject;

    % Update handles structure
    guidata(hObject, handles);
    axes(handles.axes2)
    imshow('sensordeckelOben.jpg');

    % UIWAIT makes RackWriter wait for user response (see UIRESUME)
    % uiwait(handles.figure1);


    % --- Outputs from this function are returned to the command line.
    function varargout = RackWriter_OutputFcn(hObject, eventdata, handles) 

    % Get default command line output from handles structure
    varargout{1} = handles.output;


    % --- Executes on button press in onOff.
    function onOff_Callback(hObject, eventdata, handles)
    % hObject    handle to onOff (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)

%This is where my stuff begins
    % Preparations
    close all                   %close all figures
    clear all                   %clear all workspace variables
    fclose('all')               %close all Files
    delete(instrfindall)        %Reset Com Port
    delete(timerfindall)        %Delete Timers
    %clear handles

    % setup serial
    serialPort = serial('COM3');
    command = 'A';

    nrow = 16;
    ncol = 10;
    row_index = [9,10,11,12,13,14,15,16,8,7,6,5,4,3,2,1];
    col_index = [1,2,3,4,5,6,7,8,9,10];

    % 10x16 = 160 bytes
    lendata = 160;

    BaudRate = 115200;

    %InputBufferSize is bein displayed (disp(serialPort.BytesAvailable))
    %with only 322 Bytes. The more information it has to process, the more
    %bytes that havve to be stored in the InputBufferSize. But it seams to
    %not go over 400
    InputBufferSize = 500;

    Timeout = 1;

    set(serialPort , 'BaudRate', BaudRate);
    set(serialPort , 'InputBufferSize', InputBufferSize);
    set(serialPort , 'Timeout', Timeout);

    fopen(serialPort);

    while 1

    % Request data
    fprintf(serialPort, command);

    % Get data
    %Data is read as string (CSV)
    data_string = fgetl(serialPort);
    data_string_array = strsplit(data_string, ',');
    data = str2double(data_string_array);

    % Reshape data (1D -> 2D array)
    data2d = zeros(nrow, ncol);
    k = 1;
    for i = 1:nrow
       for j = 1:ncol
          data2d(row_index(i), col_index(j)) = data(k);
          k = k + 1;
       end
    end

    %resize 16x10 image to 160x100 image
    data2d_resized = imresize(data2d,10);
    %sensetivity [0 255]
    %axes(handles.axes1)
    imshow(data2d_resized,[0 50]);

    %clean out the InputBufferSize
    flushinput(serialPort)
    end
    fclose(serialPort);

【讨论】:

  • 正如我在下面评论我的答案:尝试删除 clear all 命令
  • 我真的不明白问题出在哪里。也许将第 29 行放在第 31 行之后,但这不应该解决问题。当然,不要清除handles。另外,将guidata(hObject,handles); 放在每个函数的末尾。尽量避免使用close all 命令,而是指定要关闭的某些数字。
  • 好的,谢谢。因为我屏蔽了所有我关闭的所有行,所以我会在我想要的地方显示一个图像。但我仍然收到错误,它不会自行更新。
  • 如果您有具体问题,我很乐意为您提供帮助。就更新而言:试试我下面的答案:用第一行初始化图形,用第二行更新图形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多