matlab人脸识别动态界面,Matlab PCA+SVM人脸识别(二)——GUI界面设计

上一篇介绍了人脸识别的主要算法,为了便于操作和,使界面更加友善,在之前的基础上做了GUI开发,界面如下:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

GUI界面的主程序:

保存为faceGUI.m文件,若你已经添加过当前文件所在的路径,那么在Matlab的command window里写入faceGUI即可运行

global h_axes1;

global h_axes2;

global edit2;

h_f=figure('name','人脸识别系统','position',[300,200,600,400]);

clf reset;

set(h_f, 'defaultuicontrolfontsize' ,12);

set(h_f, 'defaultuicontrolfontname' , '宋体' );

h_axes1=axes('parent',h_f,'position',[0.2 0.28 0.25 0.56],'Unit','normalized','visible','off');

h_axes2=axes('parent',h_f,'position',[0.55 0.28 0.25 0.56],'Unit','normalized','visible','off');

figcolor=get(h_f,'color');

edit2=uicontrol(h_f,'style','text','position',[150,330,300,40],'backgroundcolor',figcolor);

button_open=uicontrol(h_f,'style','push','string','选择照片','position',[250 50 100 50],'callback','GUIopen');

button_recg=uicontrol(h_f,'style','push','string','测试准确率','position',[100 50 100 50],'callback','face');

button_match=uicontrol(h_f,'style','push','string','图像匹配','position',[400 50 100 50],'callback','GUIrecg');button_recg即显示为测试准确率的按键的回调函数为face.m,但是为了让程序运行的进程在界面上可以动态显示,需要对原来的程序做一些修改,具体如下:

clc,clear

npersons=40;%选取40个人的脸

global imgrow;

global imgcol;

global edit2

imgrow=112;

imgcol=92;

set(edit2,'string','读取训练数据......')%显示在句柄为edit2的文本框里

drawnow %更新窗口的内容,不然程序结束时才会显示,这样只能看到最后一句

f_matrix=ReadFace(npersons,0);%读取训练数据

nfaces=size(f_matrix,1);%样本人脸的数量

set(edit2,'string','训练数据PCA特征提取......')

drawnow

mA=mean(f_matrix);

k=20;%降维至20维

[pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特征提取

set(edit2,'string','训练数据规范化......')

drawnow

lowvec=min(pcaface);

upvec=max(pcaface);

scaledface = scaling( pcaface,lowvec,upvec);

set(edit2,'string','SVM样本训练......')

drawnow

gamma=0.0078;

c=128;

multiSVMstruct=multiSVMtrain( scaledface,npersons,gamma,c);

save('recognize.mat','multiSVMstruct','npersons','k','mA','V','lowvec','upvec');

set(edit2,'string','读取测试数据......')

drawnow

[testface,realclass]=ReadFace(npersons,1);

set(edit2,'string','测试数据特征降维......')

drawnow

m=size(testface,1);

for i=1:m

testface(i,:)=testface(i,:)-mA;

end

pcatestface=testface*V;

set(edit2,'string','测试数据规范化......')

drawnow

scaledtestface = scaling( pcatestface,lowvec,upvec);

set(edit2,'string','SVM样本分类......')

drawnow

class= multiSVM(scaledtestface,multiSVMstruct,npersons);

set(edit2,'string','测试完成!')

accuracy=sum(class==realclass)/length(class);

msgbox(['识别准确率:',num2str(accuracy*100),'%。'])button_open即显示为”选择照片“的按钮的回调函数是GUIopen.m,其内容如下:

global h_axes1

[filename,pathname]=uigetfile({'*.pgm';'*.jpg';'*.tif';'*.*'},'请选择一张用于识别的照片');

if filename==0

msgbox('请选择一张照片文件')

else

filepath=[pathname,filename];

axes(h_axes1);

imshow(imread(filepath));

endbutton_recg

即显示为”图像匹配“的按钮的回调函数是GUIrecg.m,其内容如下:

global h_axes1

global h_axes2

global edit2

load('recognize.mat');

set(edit2,'string','读取测试数据......')

drawnow

disp('读取测试数据...')

disp('.................................................')

img=getimage(h_axes1);%获得之前选中的照片的信息

if isempty(img)

msgbox('请先选择一张图片!')

break

end

testface=img(:)';

set(edit2,'string','测试数据降维......')

drawnow

disp('测试数据特征降维...')

disp('.................................................')

Z=double(testface)-mA;

pcatestface=Z*V;

set(edit2,'string','测试特征数据规范化......')

drawnow

disp('测试特征数据规范化...')

disp('.................................................')

scaledtestface=-1+(pcatestface-lowvec)./(upvec-lowvec)*2;

set(edit2,'string','SVM样本识别......')

drawnow

disp('SVM样本识别...')

disp('.................................................')

voting=zeros(1,npersons);

for i=1:npersons-1

for j=i+1:npersons

class=svmclassify(multiSVMstruct{i}{j},scaledtestface);

voting(i)=voting(i)+(class==1);

voting(j)=voting(j)+(class==0);

end

end

[~,class]=max(voting);

set(edit2,'string','识别完成!')

drawnow

axes(h_axes2);

imshow(imread(['E:\ORL_face\s',num2str(class),'\1.pgm']));

msgbox(['样本识别为第',num2str(class),'个人'])

转载请您尊重作者的劳动,完整保留

文章

出处

以及

文章链接

,谢谢您的支持!

欢迎您参与讨论~让我们共同进步~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值