Matlab PCA+SVM人脸识别(二)

上一篇介绍了人脸识别的主要算法,为了便于操作和,使界面更加友善,在之前的基础上做了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:mtestface(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==0msgbox('请选择一张照片文件')elsefilepath=[pathname,filename];axes(h_axes1);imshow(imread(filepath));endbutton_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-1for j=i+1:npersonsclass=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),'个人'])

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

在向山靠近一点,才发现这座山,好象一位诗人遥望远方,

Matlab PCA+SVM人脸识别(二)

相关文章:

你感兴趣的文章:

标签云: