一个RGB数据采集实例学习matlab_GUI界面设计

一、环境平台

window10+matlab2016a

二、界面设计

1.创建流程

主页》新建》应用程序》GUIDE》新建GUI》blank GUI(default)   那么我们就新建了一个GUI界面如下

下面就是自己的设计了。

2.控件选择及设置

2.1 RGB数据采集任务需求:

     1、需要的是从文件夹中选择一张图片,并将这张图片显示在界面上。

     2、点击鼠标在图片上选取10个点采集相应的RGB数据

     3、完成一幅图片的采集以后将数据保存到EXCEL中

2.2 根据任务我们需要一个打开文件的按钮、一个完成采集的按钮以及一个放图片的控件。对于放图片的控件我们可以选择坐标轴。

设计出如下界面

2.3 对于控件属性主要是更改string和tag属性,鼠标右击按钮》属性检查器》将string改成打开文件、Tag改成open_file.其他的同理。

更改所有的控件string和tag属性,以及更改一下字体大小fontsize.得到如下界面

此时可以点击演示一下。那么此时就会保存我们设计的fig文件,并根据界面自动产生相应的.m文件。也就是matlab的GUI界面设计是一个fig文件对应一个.m文件。fig文件主要使设计界面,.m文件主要是实现对应控件的功能的。

3.控件功能实现

3.1 右击打开文件》查看回调》callback  那么就会调到对应的函数里去。设计打开文件的程序

function open_file_Callback(hObject, eventdata, handles)
% hObject    handle to open_file (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global img_src
global filename_copy 
global data_RGB
[filename, pathname] = uigetfile({'*.bmp;*.jpg;*.png;*jpeg', 'Image Files(*.bmp,*.jpg,*.png,*jpeg)';...
    '*.*','All Files (*.*)'},'pick an image');            %打开一个对话框
set(handles.figure_name,'string',filename);    %给静态文本赋值,显示当前图片文件名
filename_copy = filename;                           %拷贝一份文件名
data_RGB = [filename];                                 %将文件名放在数据前,一起存入excel
if isequal(filename,0) || isequal(pathname,0)  %点击取消的响应
    return;
end
axes(handles.axes1);        %用axes命令设定当前操作的坐标轴是axes1
fpath = [pathname,filename];%将文件名和目录名组合成一个完整的路径
img_src = imread(fpath);    %用imread读入图片
imshow(img_src);            %imshow在axes1上显示

3.2 完成采集按钮的设计

function finish_collect_Callback(hObject, eventdata, handles)
% hObject    handle to finish_collect (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global data_RGB
global filename_copy
global img_src
global i
path = 'F:\code\matlab\tlb_design\sign_save\';   %标记后图片的存放路径
name_path = strcat(path,filename_copy);          %路径加上名字
frame = getframe(gca);                                     %捕获坐标区图像作为影片帧
sign_image = frame2im(frame);                         %将捕获的影片帧转换为图像数据
imwrite(sign_image,name_path);                        %保存图像,这个会降低图像的分辨率
position = strfind(filename_copy,'-');                  %根据图片命名特点找到字符-的位置,为了提取前面的数字
fig_number = filename_copy(1:position-1);        %得到文件名的前几个数字,作为记录第几张图片
fig_number = str2num(fig_number);
xls_pos = strcat('A', num2str(fig_number+1));    %设定excel存放位置,加1是因为从第二行开始
if i == 10 || i == 11
    xlswrite('save_RGBdata.xlsx',data_RGB,1,xls_pos);                 %点击完成采集,那么一副图像的数据就存到excel中
    msgbox('数据存储完成!')                               %储存完毕后弹出对话框
    i = 0;                                                             %此时点计数清零
    data_RGB = [];                                               %存完以后,data_RGB数据清空,为下次数据从头开始存

else
    msgbox('采集信息未完成,请继续采集');
end

3.3 在图片点击鼠标能够采集RGB数据并圈出的程序设计

function figure_image_WindowButtonDownFcn(hObject, eventdata, handles)
% hObject    handle to figure_image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global pointXY
%global hText
global circle
global img_src
global data_RGB
global i
axis on 
if strcmp(get(hObject,'SelectionType'),'normal')  %点击鼠标左键
    pt = get(gca,'CurrentPoint');           %这个得到就是当前鼠标点击的位置,以图片左上角为零点
    x = round(pt(1,1));
    y = round(pt(1,2));
    hold on                                         %保持在当前图像上操作,防止覆盖
    circle = plot(x,y,'bo','MarkerSize',3);  %在点击的地方,画出圆圈。
%     str = sprintf('x = %.3f, y = %.3f', x, y);
%     hText=text(x, y, str,'color',[1 0 0])
    pointXY=[x y];                                %存放当前的坐标
    i = i + 1;                                         %点一次按钮 i加1
    r = img_src(pointXY(1),pointXY(2),1);            %取某一点坐标处的RGB数据
    g = img_src(pointXY(1),pointXY(2),2);
    b = img_src(pointXY(1),pointXY(2),3);
    RGB = [r g b];                                              %一个点的RGB数据
    %将数值阵列转换成异质阵列,为了和文件名字能一起存储到excel,不写不能正常储存。
    RGB_cell = num2cell(RGB);
    data_RGB = [data_RGB,RGB_cell];                %将文件名和所有点数据放在一个矩阵  
elseif strcmp(get(hObject,'SelectionType'),'alt')  %点击鼠标右键,消除刚点的那一点
    if ishandle(circle)
        delete(circle);                                            %删除圆圈
        pointXY(end,:)=[];                                     %删除记录的坐标
        data_RGB(end-2:end) = [];                        %删除刚采集的RGB值,即最后三个数据
    end
end

3.4 注意的地方

3.4.1 如果想让一个变量在其他的控件函数里面都能被共享,那么我们需要在openingfcn定义变量为global.

function gui_test_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 gui_test (see VARARGIN)

%set(hObject,'toolbar','figure') % 在菜单栏显示figure工具条的内容 
global img_src                 %打开图片的全局变量
global pointXY                 %存放点坐标的全局变量
pointXY=[];
global data_RGB              %存放每幅图像选取的所有点数据
data_RGB = [];
global i                            %计算每幅图像点的变量
i = 0;
global filename_copy       %拷贝一份文件名

主要在其他控件函数想操作这种全局变量,那么也要事先写上global。

3.4.2 对于figure_image_WindowButtonDownFcn这个函数的产生

右击非控件的网格区域》查看回调》WindowButtonDownFcn。这个函数就产生了。这个函数只要我们点击界面就会得到相应的坐标。

5.完整代码获取请移步我的github:initbin

https://github.com/initbin/RGBdata_collection_GUI

参考文献

https://blog.csdn.net/a573233077/article/details/51870509

https://wenku.baidu.com/view/fdf6ad6925c52cc58bd6be8e.html

https://blog.csdn.net/xuxinrk/article/details/80563915

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值