11.9
大作业进度开始的有点晚,记一下学习心得。
首先学习一下GUI界面的制作。看了一下老师给的别人的源码,功能很多也很好,但是和我们自己的作业要求有点差别,而且也不能copy。我用的2020版matlab,直接在软件找已经找不到GUI,好像以后都要变成app了,但是这次大作业我们还是得做GUI,哈哈。
找了一下GUI基础教程。(补充一下心得:建议先了解一下handles再做回调会简单很多)
Matlab实践之图形化界面设计与使用
从文件夹加载图片的GUI教程,创建按钮和坐标区。
GUI加载图片
新建一个GUI,保存为fig格式。实验要求显示的图片感觉好多,都不知道怎么排版比较好。建议多使用对齐工具和按钮组,让界面看起来更舒服。了解了一下基础的回弹事件,感觉GUI也挺简单的,放到对应函数里面去就好了。
基础控件的使用和回调
【新手向】手把手带你入门的MATLAB的GUI编程实例
打算先做一下GUI界面然后再慢慢调用函数。
下午做了一个简单的基础界面。
11.11
今天做maya大作业和复习线代去了,晚上做一下matlab。
改了一下每个组件的Tag,然后在导入图片的callback回调事件中加入代码。
% '*.*'为显示当前文件夹中的所有文件;
% select a picture为文件对话框的标题;
% 'multiselect','on'为打开选择多个模式(默认为关);
axes(handles.origin)
[fn, pn, ~] = uigetfile('*.*','请选择所要识别的图片','multiselect','on');
I = imread([pn fn]);%读取图像参数为图像名称和图像路径
imshow(I);
参考了一下别人的代码,觉得应该在界面初始化的时候设置所有按钮无法点击,不然有功能没有图片会出现问题,先加载图片才能使用功能。
%设置按钮不可点击
set(handles.grey,'Enable','off');
set(handles.binary,'Enable','off');
set(handles.getapple,'Enable','off');
set(handles.getcoin,'Enable','off');
set(handles.balance,'Enable','off');
set(handles.picadd,'Enable','off');
set(handles.picsub,'Enable','off');
set(handles.light,'Enable','off');
……
%写一个函数方便调用
function on(handles)
set(handles.grey,'Enable','on');
set(handles.binary,'Enable','on');
set(handles.getapple,'Enable','on');
set(handles.getcoin,'Enable','on');
set(handles.balance,'Enable','on');
set(handles.picadd,'Enable','on');
set(handles.picsub,'Enable','on');
set(handles.light,'Enable','on');
……
%调用方法
on(handles)%激活按钮
11.12
周末早起做作业了,加载摄像头,用的这个教程。
MATLAB调用USB摄像头实现过程
报错:错误使用 webcam (line 116) 已存在与网络摄像机 EasyCamera 的有效连接。不能创建与同一网络摄像机的另一连接。
解决方法:
clear % 清除变量
clc % 清除界面信息
在Gui界面中显示视频流尽量使用Image Acquisition Toolbox。但是我装不了,所以还是使用的其他方法,看起来还是很成功的。
webcamlist;
cam1 = webcam(1);
img = snapshot(cam1); %抓拍图片
axes(handles.origin) %展示到第一个坐标
imshow(img);
handles.img=img;%存入句柄
handles.img2=img;
axes(handles.result) %展示到第二个坐标
imshow(handles.img2);
clear cam1 %关闭摄像头
on(handles)%激活按钮
guidata(hObject, handles);
图片灰度化,我刚开始不是很懂,把img变成全局变量,然后在后面进行调用。在灰度化的时候要使用有颜色的rgb图片才行,不能用已经灰度化的图片,再加载直方图。
在进行直方图的加载的时候我又遇到了第一次做实验遇到的错误,像这样,要把figure写在前面,把imhist函数写在最后,否则加载的直方图就是一条直线。
%普通加载
figure(6); subplot(1,2,1);
imhist(g,64);
%在gui中加载直方图
axes(handles.axes4)
imhist(handles.img2,64); %转换直方图
坐标轴稍微有一点重叠,但是应该不影响观看,就这样吧。 亮度变化也做好了。
后面发现自己用global全局变量传递数据的办法有点笨,改成了用句柄,哎,真的很折腾。
guidata handles理解
放几个常用的交互传递GUI参数的代码
%获取滑动条选择的参数
th = get(handles.binary,'Value')%0~1之间的一个数值
%滑动条最大值为1.0,最小值为0.0是因为im2bw函数的阈值输入在0~1之间
%二值化时自定义拖动选择的阈值
%把滑动条的数字传递到GUI界面的文本框中
set(handles.text11,'String',num2str(th));
%获取可编辑文本框edit中的参数,记得类型是string,需要转成num数值类型才能使用
handles.angle=str2num(get(handles.edit3,'String'));%获得输入值
二值化,图像叠加和亮度变化也做完了。在做的时候不断调整gui,使其更加合理。
运动模糊和对数,指数变换已实现。(这些都是平时作业有的代码就不放出来了)今天做了差不多六个小时,有点累。
11.13,继续
val=get(hObject,'Value');%获得选取项
%不同选项事件
switch val
case 1
%对话框
helpdlg('请选择需要添加的噪声','Morphological Operations');
case 2
handles.img3=imnoise(handles.img3,'gaussian',0.02);
axes(handles.uppic); %在右边进阶图像中展示
imshow(handles.img3);
case 3
handles.img3=imnoise(handles.img3,'salt & pepper',0.02);
axes(handles.uppic); %在右边进阶图像中展示
imshow(handles.img3);
end
guidata(hObject, handles);
像这种必须要有3x3或者5x5模板才能进行滤波器操作,有前提条件的情况,那么选择的radiobutton最好添加一个默认值,也就是有默认勾选,在CreateFcn回调里面添加。
function x3_CreateFcn(hObject, eventdata, handles)
%初始值
handles.mould=3;
guidata(hObject, handles);%保存句柄
高斯滤波在实验3的时候没有做,花了一点时间找代码和学习。 handles真好用,什么类型的值都可以存ovo
function filter_Callback(hObject, eventdata, handles)
val=get(hObject,'Value');%获得选取项
%不同选项事件
switch val
case 1
%对话框
helpdlg('请选择需要使用的滤波器','Morphological Operations');
case 2
%均值滤波模板
handles.num=1;
handles.mb=fspecial('average',handles.mould);
case 3
handles.num=2;
case 4
%高斯滤波模板
handles.num=3;
handles.mb=fspecial('gaussian',[handles.mould,handles.mould],1);
end
guidata(hObject, handles);
function ok1_Callback(hObject, eventdata, handles)
if handles.num==1
%均值滤波器,255归一化
handles.img3= filter2(handles.mb,handles.img3)/255;
axes(handles.uppic); %在右边进阶图像中展示
imshow(handles.img3);
end
if handles.num==2
%中值滤波
handles.img3= medfilt2(handles.img3,[handles.mould handles.mould]);
axes(handles.uppic); %在右边进阶图像中展示
imshow(handles.img3);
end
if handles.num==3
handles.img3=filter2(handles.mb,handles.img3)/255;%用生成的高斯序列进行滤波
axes(handles.uppic); %在右边进阶图像中展示
imshow(handles.img3);
end
guidata(hObject, handles);
大多数功能都做完了,还剩硬币检测和提取红苹果
11.18
前几天在准备线代考试,没有进度,今天继续。
判断图像是否已经灰度化的方法。
[m,n,l] = size(handles.img3);%检测图片的规格
if l == 3
handles.img3 = rgb2gray(handles.img3); %如果为彩色图 则转化为灰度图
else
handles.img3=handles.img3;
end
红苹果检测老师给的代码又要装一个什么工具箱,好麻烦,我看看有没有其他办法可以做,先做了硬币检测。
基于Matlab实现硬币识别