一、环境平台
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