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

来源:互联网 发布:海淘软件 编辑:程序博客网 时间:2024/06/06 19:03

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


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,clearnpersons=40;%选取40个人的脸global imgrow;global imgcol;global edit2imgrow=112;imgcol=92;set(edit2,'string','读取训练数据......')%显示在句柄为edit2的文本框里drawnow     %更新窗口的内容,不然程序结束时才会显示,这样只能看到最后一句f_matrix=ReadFace(npersons,0);%读取训练数据nfaces=size(f_matrix,1);%样本人脸的数量set(edit2,'string','训练数据PCA特征提取......')drawnowmA=mean(f_matrix);k=20;%降维至20维[pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特征提取set(edit2,'string','训练数据规范化......')drawnowlowvec=min(pcaface);upvec=max(pcaface);scaledface = scaling( pcaface,lowvec,upvec);set(edit2,'string','SVM样本训练......')drawnowgamma=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','测试数据特征降维......')drawnowm=size(testface,1);for i=1:m    testface(i,:)=testface(i,:)-mA;endpcatestface=testface*V;set(edit2,'string','测试数据规范化......')drawnowscaledtestface = scaling( pcatestface,lowvec,upvec);set(edit2,'string','SVM样本分类......')drawnowclass= 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));end
button_recg即显示为”图像匹配“的按钮的回调函数是GUIrecg.m,其内容如下:
global h_axes1global h_axes2global edit2load('recognize.mat');set(edit2,'string','读取测试数据......')drawnowdisp('读取测试数据...')disp('.................................................')img=getimage(h_axes1);%获得之前选中的照片的信息if isempty(img)    msgbox('请先选择一张图片!')    breakendtestface=img(:)';set(edit2,'string','测试数据降维......')drawnowdisp('测试数据特征降维...')disp('.................................................')Z=double(testface)-mA;pcatestface=Z*V;set(edit2,'string','测试特征数据规范化......')drawnowdisp('测试特征数据规范化...')disp('.................................................')scaledtestface=-1+(pcatestface-lowvec)./(upvec-lowvec)*2;set(edit2,'string','SVM样本识别......')drawnowdisp('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);    endend[~,class]=max(voting);set(edit2,'string','识别完成!')drawnowaxes(h_axes2);imshow(imread(['E:\ORL_face\s',num2str(class),'\1.pgm']));msgbox(['样本识别为第',num2str(class),'个人'])

转载请您尊重作者的劳动,完整保留文章出处以及文章链接,谢谢您的支持!
欢迎您参与讨论~让我们共同进步~




5 0
原创粉丝点击