MATLAB的GUI

请教大家,在MATLAB中,我要做一个GUI界面,可是运行函数时总是,函数中的处理摄像头后的图像总是单独跳出来,显示不到我的GUI界面的Axes控件里面。

img

img

回答引用new Bing:
这个问题通常是由于MATLAB GUI中的图像显示和函数的处理分别在不同的线程上运行引起的。为了将处理后的图像显示到GUI界面上,您需要确保在GUI的主线程上显示图像。

一种可能的解决方案是使用回调函数来更新GUI中的Axes控件,并确保在该回调函数中显示图像。具体来说,您可以执行以下步骤:

1 将摄像头采集到的图像传递给您的函数进行处理。
2 在处理函数中,将处理后的图像存储在一个变量中,然后调用一个回调函数来更新GUI界面上的Axes控件。
3 在回调函数中,将存储的图像显示在Axes控件中。确保在此过程中使用drawnow函数强制MATLAB执行任何待处理的绘图命令并更新GUI界面。
以下是示例代码,其中myFunction为您的处理函数,updateImage为回调函数:

function myGUI()
% 创建GUI界面和Axes控件
fig = figure();
ax = axes('Parent', fig, 'Units', 'normalized', 'Position', [0.2 0.2 0.6 0.6]);
% 创建一个按钮,当点击时调用myFunction函数进行图像处理
btn = uicontrol('Style', 'pushbutton', 'String', 'Process Image', ...
    'Position', [20 20 100 25], 'Callback', @myFunction);

function myFunction(~, ~)
    % 在此处执行您的图像处理操作,并将处理后的图像存储在img变量中
    img = yourImageProcessingFunction();
    
    % 调用updateImage回调函数来更新GUI界面上的图像
    updateImage(img);
end

function updateImage(img)
    % 将存储的图像显示在Axes控件中
    imshow(img, 'Parent', ax);
    % 强制MATLAB更新GUI界面
    drawnow;
end
end

在上面的示例代码中,myFunction和updateImage都是在GUI主线程上运行的,因此可以正确地更新Axes控件并显示图像。

该回答引用ChatGPT
问题分析:

问题描述中出现了两张图片,第一张是GUI界面,第二张是摄像头的输出窗口。可以看出,由于自己写的代码问题,程序没有将摄像头输出的图像显示到GUI界面的Axes控件中,而是另外弹出了一个窗口。

解决方案:

针对这个问题,可以用以下两种方式解决:

1.将摄像头输出的图像直接显示在GUI界面的Axes控件中,不需要额外开辟窗口来显示图像。这种方式可以通过在GUI界面的Axes控件上使用imshow函数来实现。

2.将另外开辟的窗口的图像和GUI界面的Axes控件的句柄传递给一个自定义的函数中,使用回调函数来将两个窗口中的图像实时同步更新。这种方式需要用到MATLAB的图像回调函数。

代码实现:

方式一:

%%% 代码步骤 %%%
% 1、在GUI界面设计中添加Axes控件;
% 2、在回调函数中使用imread函数读取摄像头输出的图像;
% 3、使用imshow函数将图像显示在Axes控件中;
% 4、在结束时关闭摄像头。

% GUI界面设计中的Axes控件的句柄可以通过以下方式获得
handles.axes1 = findobj('Tag','axes1');

% 摄像头的初始化
camera = webcam(1);

while(1)
% 读取图像
img = snapshot(camera);
% 将图像显示在Axes控件中
imshow(img,'Parent',handles.axes1);
end

% 关闭摄像头
clear camera;

方式二:

%%% 代码步骤 %%%
% 1、在GUI界面设计中添加Axes控件;
% 2、在回调函数中使用imread函数读取摄像头输出的图像;
% 3、将摄像头输出的图像和GUI界面Axes控件的句柄传递给回调函数;
% 4、在MATLAB中定义回调函数,将两个窗口中的图像实时同步更新;
% 5、在结束时关闭摄像头。

% GUI界面设计中的Axes控件的句柄可以通过以下方式获得
handles.axes1 = findobj('Tag','axes1');

% 摄像头的初始化
camera = webcam(1);

while(1)
% 读取图像
img = snapshot(camera);
% 调用回调函数,将图像和GUI界面Axes控件句柄传进去
myCallbackFunction(handles.axes1,img);
end

% 关闭摄像头
clear camera;

% 回调函数的编写
function myCallbackFunction(hObject,img)
% 将传入的图像显示在另外一个窗口中
figure(gcf);imshow(img);
% 将图像显示在GUI界面的Axes控件中
set(hObject,'XTick',[],'YTick',[]);
imshow(img,'Parent',hObject);
% 刷新窗口
drawnow;
end

注:以上代码仅为示例代码,实际使用时需要根据自己的情况进行适当修改。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,需要在GUI中添加一个Axes控件,用于显示摄像头捕获的图像。假设该控件的Tag为"axes_camera"。

然后,在运行函数中,需要将处理后的图像显示在Axes控件中。具体步骤如下:

  1. 获取Axes控件的handle,即该控件的唯一标识符:
axes_handle = findobj('Tag', 'axes_camera');
  1. 将处理后的图像显示在Axes控件中:
imshow(processed_image, 'Parent', axes_handle);

其中,processed_image是处理后的图像,可以是一个矩阵或一个图像文件路径。

完整代码如下:

function my_function(~, ~)
    % Callback function for button click event
    
    % Capture image from camera
    camera = webcam;
    raw_image = snapshot(camera);
    
    % Process image
    processed_image = my_image_processing_function(raw_image);
    
    % Display processed image in Axes control
    axes_handle = findobj('Tag', 'axes_camera');
    imshow(processed_image, 'Parent', axes_handle);
    
    % Release camera
    clear camera;
end

其中,my_image_processing_function是自定义的图像处理函数,根据实际需求进行编写。
如果我的回答解决了您的问题,请采纳!