MATLAB的GUI界面显示处理后的摄像头

我现在有个函数时进行摄像头画面的直线检测的,函数里有显示检测后的图像功能,怎么运用这个函数显示在GUI界面里?

我引用ChatGPT作答:
要在MATLAB GUI界面中显示摄像头处理后的图像,可以使用MATLAB自带的GUI工具箱中的图像显示控件 axes。以下是一些简单的步骤:

创建一个新的GUI界面,在其中添加一个 axes 控件用于显示图像。

在GUI界面中添加一个按钮或其他交互控件,用于触发图像处理函数。

在按钮回调函数中,调用你的摄像头直线检测函数,并获取处理后的图像。

将处理后的图像显示在 axes 控件中,可以使用 imshow 函数来实现。

下面是一些伪代码来说明这个过程:

% 创建GUI界面并添加一个axes控件
figure;
ax = axes('Parent', gcf, 'Units', 'normalized', 'Position', [0.1 0.1 0.8 0.8]);

% 添加一个按钮
btn = uicontrol('Style', 'pushbutton', 'String', '检测直线', 'Callback', @detect_lines);

% 检测直线的回调函数
function detect_lines(hObject, eventdata)
    % 调用摄像头直线检测函数并获取处理后的图像
    processed_image = detect_lines_on_camera_image();

    % 在axes控件中显示处理后的图像
    imshow(processed_image, 'Parent', ax);
end

需要注意的是,如果你的摄像头直线检测函数已经包含了显示处理后图像的功能,那么可以将这个函数的输出作为 imshow 函数的输入来显示图像。如果你想要在GUI界面中实时显示摄像头画面,需要使用MATLAB的视频处理工具箱,并且将摄像头数据传递给 vision.VideoPlayer 对象来实现。

如果你使用的是matlab2015b的话。
一、在GUI上添加一个坐标轴

img


二、把你的显示图片函数脚本放到根目录下

img

三、在初始化中创建计时器

timePeriod = 1.0;
t = timer('TimerFcn',{@timerCallback, handles.axes1}, 'ExecutionMode', 'fixedDelay', 'Period', timePeriod);
% 启动定时器
start(t);

四、自己写计时器函数,你的显示图片函数,在计时器函数里调用

function timerCallback(~, ~, axestemp)
mypic =LoadMyPic('图片\海绵宝宝.jpg');
axes(axestemp);

%这一句只运行一次!!就注释掉
%figure('visible','off');
imshow(mypic);

结果这样:

img

初次运行要运行一次 figure('visible','off'); 要不会一直有个plot的图,运行一次就注释掉。

GUI.m的全部内容

function varargout = untitled(varargin)
% UNTITLED MATLAB code for untitled.fig
%      UNTITLED, by itself, creates a new UNTITLED or raises the existing
%      singleton*.
%
%      H = UNTITLED returns the handle to a new UNTITLED or the handle to
%      the existing singleton*.
%
%      UNTITLED('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UNTITLED.M with the given input arguments.
%
%      UNTITLED('Property','Value',...) creates a new UNTITLED or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before untitled_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to untitled_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help untitled

% Last Modified by GUIDE v2.5 29-Mar-2023 19:27:15

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @untitled_OpeningFcn, ...
                   'gui_OutputFcn',  @untitled_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 untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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

global t;
% 创建 timer 对象对象的代码
timePeriod = 1.0;
t = timer('TimerFcn',{@timerCallback, handles.axes1}, 'ExecutionMode', 'fixedDelay', 'Period', timePeriod);
% 启动定时器
start(t);


function timerCallback(~, ~, axestemp)
mypic =LoadMyPic('图片\海绵宝宝.jpg');
axes(axestemp);

%这一句只运行一次!!就注释掉
%figure('visible','off');
imshow(mypic);


% --- Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

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


% --- Executes during object deletion, before destroying properties.
function figure1_DeleteFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global t;
stop(t); delete(t);
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/376952
  • 这篇博客也不错, 你可以看下MATLAB视频人体异常行为检测识别(GUI,论文)
  • 除此之外, 这篇博客: MATLAB GUI界面编程——一些细节问题中的 十、在设计GUI界面时,期望运行代码(具体某个算法)的同时,用一个进度条来展示算法的运行进度。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • (类似的问题:期望运行进度条的同时,后台也执行着其他代码。)

    如题。搜索浏览了一些网页资料和书籍。得出的结论:

    MATLAB是一种单线程运行结构后台程序依次顺序执行MATLAB不提供异步的功能给用户

    而我这里后台执行的算法代码是一个封装的整体,所以就不可能边执行算法程序,边用进度条展示出程序执行进度。

    如果用waitbar()做一个界面上的进度条,也只是给出一个虚假的进度,并且按照顺序执行的思路,也要先展示完进度条,后台才真正开始执行我的算法代码。所以这个想法暂时不能实现。

    (该问题也参考了网址:http://www.ilovematlab.cn/thread-315978-1-1.html(MATLAB GUI 在运行进度条的同时后台处理数据))

    附: waitbar()函数的官方文档:https://ww2.mathworks.cn/help/matlab/ref/waitbar.html?refresh=true

     

该回答引用ChatGPT
要在MATLAB的GUI界面中显示处理后的摄像头画面,可以使用MATLAB的图形用户界面(GUI)工具箱。下面是一些步骤:
1. 创建一个GUI界面,可以使用GUIDE工具箱或手动编写代码创建。
2. 在GUI界面中添加一个axes控件,用于显示摄像头画面。
3. 在GUI界面中添加一个按钮或其他控件,用于触发摄像头画面的直线检测函数。
4. 在按钮的回调函数中,调用摄像头直线检测函数,并将处理后的图像显示在axes控件中。
下面是一个简单的示例代码:
matlab
% 创建GUI界面
fig = figure('Name', '摄像头直线检测', 'Position', [100 100 640 480]);
% 添加axes控件
axes_handle = axes('Parent', fig, 'Units', 'normalized', 'Position', [0.1 0.1 0.8 0.8]);
% 添加按钮控件
button_handle = uicontrol('Parent', fig, 'Style', 'pushbutton', 'String', '检测直线', 'Units', 'normalized', 'Position', [0.4 0.05 0.2 0.05], 'Callback', @button_callback);
% 摄像头直线检测函数
function detect_lines()
% 获取摄像头图像
cam = webcam();
img = snapshot(cam);
delete(cam);

% 进行直线检测
% 这里假设有一个名为detect_lines的函数进行直线检测
img_processed = detect_lines(img);

% 在axes控件中显示处理后的图像
imshow(img_processed, 'Parent', axes_handle);
end
% 按钮回调函数
function button_callback(~, ~)
detect_lines();
end

在这个示例代码中,我们创建了一个GUI界面,包含一个axes控件和一个按钮控件。当用户点击按钮时,会调用detect_lines函数进行摄像头直线检测,并将处理后的图像显示在axes控件中。注意,在detect_lines函数中,我们使用了MATLAB的webcam函数获取摄像头图像,然后调用了一个名为detect_lines的函数进行直线检测。你需要根据你的具体需求修改这些代码。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
要在MATLAB的GUI界面中显示经过处理后的摄像头画面,需要将处理后的图像显示在一个axes对象中,然后将该对象添加到GUI界面中。以下是实现该功能的步骤和示例代码:

  1. 在GUI界面中添加一个axes对象,可以通过GUIDE工具或者手写代码实现。假设该对象的句柄为handles.axes1。

  2. 在代码中调用进行直线检测的函数,并将处理后的图像保存到一个变量中,如下所示:

% 调用直线检测函数
img = line_detection(input_img);

其中,input_img是摄像头传入的原始图像,line_detection是进行直线检测的函数。

  1. 将处理后的图像显示在axes对象中,可以使用imshow函数,如下所示:
% 将处理后的图像显示在axes对象中
axes(handles.axes1);
imshow(img);

完整的代码示例如下:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
videoObject = videoinput('winvideo', 1); % 创建摄像头对象
set(videoObject,'ReturnedColorSpace','RGB'); % 将图像格式设置为RGB
set(videoObject,'FramesPerTrigger',1); % 设置每次获取的图像帧数
set(videoObject,'TriggerRepeat',Inf); % 设置触发重复次数,即一直获取图像直到停止
set(videoObject,'Timeout',10); % 设置获取图像的超时时间

input_img = getsnapshot(videoObject); % 获取一帧图像作为摄像头的当前图像
img = line_detection(input_img); % 对当前图像进行直线检测

% 将处理后的图像显示在axes对象中
axes(handles.axes1);
imshow(img);

% 关闭摄像头对象
stop(videoObject);
delete(videoObject);

其中,line_detection是进行直线检测的函数,handles.axes1是GUI界面中添加的axes对象的句柄。在代码中还包括打开摄像头对象、获取当前图像、对当前图像进行直线检测等过程。
如果我的回答解决了您的问题,请采纳!