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

时间:2022-10-19 05:41:36

声明:本文转载自http://blog.csdn.net/light_lj/article/details/26747269

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

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

GUI界面的主程序: 保存为faceGUI.m文件,若你已经添加过当前文件所在的路径,那么在Matlab的command window里写入faceGUI即可运行 [plain] view plain copy Matlab PCA+SVM人脸识别(二)——GUI界面设计Matlab PCA+SVM人脸识别(二)——GUI界面设计
  1. global h_axes1;  
  2. global h_axes2;  
  3. global edit2;  
  4. h_f=figure('name','人脸识别系统','position',[300,200,600,400]);  
  5. clf reset;  
  6. set(h_f, 'defaultuicontrolfontsize' ,12);    
  7. set(h_f, 'defaultuicontrolfontname' , '宋体' );    
  8.   
  9. h_axes1=axes('parent',h_f,'position',[0.2 0.28 0.25 0.56],'Unit','normalized','visible','off');  
  10. h_axes2=axes('parent',h_f,'position',[0.55 0.28 0.25 0.56],'Unit','normalized','visible','off');  
  11.   
  12. figcolor=get(h_f,'color');  
  13. edit2=uicontrol(h_f,'style','text','position',[150,330,300,40],'backgroundcolor',figcolor);  
  14. button_open=uicontrol(h_f,'style','push','string','选择照片','position',[250 50 100 50],'callback','GUIopen');  
  15. button_recg=uicontrol(h_f,'style','push','string','测试准确率','position',[100 50 100 50],'callback','face');  
  16. button_match=uicontrol(h_f,'style','push','string','图像匹配','position',[400 50 100 50],'callback','GUIrecg');  
button_recg即显示为测试准确率的按键的回调函数为face.m,但是为了让程序运行的进程在界面上可以动态显示,需要对原来的程序做一些修改,具体如下:
[plain] view plain copy Matlab PCA+SVM人脸识别(二)——GUI界面设计Matlab PCA+SVM人脸识别(二)——GUI界面设计
  1. clc,clear  
  2. npersons=40;%选取40个人的脸  
  3. global imgrow;  
  4. global imgcol;  
  5. global edit2  
  6. imgrow=112;  
  7. imgcol=92;  
  8.   
  9. set(edit2,'string','读取训练数据......')%显示在句柄为edit2的文本框里  
  10. drawnow     %更新窗口的内容,不然程序结束时才会显示,这样只能看到最后一句  
  11. f_matrix=ReadFace(npersons,0);%读取训练数据  
  12. nfaces=size(f_matrix,1);%样本人脸的数量  
  13.   
  14. set(edit2,'string','训练数据PCA特征提取......')  
  15. drawnow  
  16. mA=mean(f_matrix);  
  17. k=20;%降维至20维  
  18. [pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特征提取  
  19.   
  20. set(edit2,'string','训练数据规范化......')  
  21. drawnow  
  22. lowvec=min(pcaface);  
  23. upvec=max(pcaface);  
  24. scaledface = scaling( pcaface,lowvec,upvec);  
  25.   
  26. set(edit2,'string','SVM样本训练......')  
  27. drawnow  
  28. gamma=0.0078;  
  29. c=128;  
  30. multiSVMstruct=multiSVMtrain( scaledface,npersons,gamma,c);  
  31. save('recognize.mat','multiSVMstruct','npersons','k','mA','V','lowvec','upvec');  
  32.   
  33. set(edit2,'string','读取测试数据......')  
  34. drawnow  
  35. [testface,realclass]=ReadFace(npersons,1);  
  36.   
  37. set(edit2,'string','测试数据特征降维......')  
  38. drawnow  
  39. m=size(testface,1);  
  40. for i=1:m  
  41.     testface(i,:)=testface(i,:)-mA;  
  42. end  
  43. pcatestface=testface*V;  
  44.   
  45. set(edit2,'string','测试数据规范化......')  
  46. drawnow  
  47. scaledtestface = scaling( pcatestface,lowvec,upvec);  
  48.   
  49. set(edit2,'string','SVM样本分类......')  
  50. drawnow  
  51. class= multiSVM(scaledtestface,multiSVMstruct,npersons);  
  52. set(edit2,'string','测试完成!')  
  53. accuracy=sum(class==realclass)/length(class);  
  54. msgbox(['识别准确率:',num2str(accuracy*100),'%。'])  
button_open即显示为”选择照片“的按钮的回调函数是GUIopen.m,其内容如下:
[plain] view plain copy Matlab PCA+SVM人脸识别(二)——GUI界面设计Matlab PCA+SVM人脸识别(二)——GUI界面设计
  1. global h_axes1  
  2. [filename,pathname]=uigetfile({'*.pgm';'*.jpg';'*.tif';'*.*'},'请选择一张用于识别的照片');  
  3. if filename==0  
  4.     msgbox('请选择一张照片文件')  
  5. else  
  6.     filepath=[pathname,filename];  
  7.     axes(h_axes1);  
  8.     imshow(imread(filepath));  
  9. end  
button_recg即显示为”图像匹配“的按钮的回调函数是GUIrecg.m,其内容如下:
[plain] view plain copy Matlab PCA+SVM人脸识别(二)——GUI界面设计Matlab PCA+SVM人脸识别(二)——GUI界面设计
  1. global h_axes1  
  2. global h_axes2  
  3. global edit2  
  4. load('recognize.mat');  
  5. set(edit2,'string','读取测试数据......')  
  6. drawnow  
  7. disp('读取测试数据...')  
  8. disp('.................................................')  
  9. img=getimage(h_axes1);%获得之前选中的照片的信息  
  10. if isempty(img)  
  11.     msgbox('请先选择一张图片!')  
  12.     break  
  13. end  
  14. testface=img(:)';  
  15. set(edit2,'string','测试数据降维......')  
  16. drawnow  
  17. disp('测试数据特征降维...')  
  18. disp('.................................................')  
  19. Z=double(testface)-mA;  
  20. pcatestface=Z*V;  
  21. set(edit2,'string','测试特征数据规范化......')  
  22. drawnow  
  23. disp('测试特征数据规范化...')  
  24. disp('.................................................')  
  25. scaledtestface=-1+(pcatestface-lowvec)./(upvec-lowvec)*2;  
  26. set(edit2,'string','SVM样本识别......')  
  27. drawnow  
  28. disp('SVM样本识别...')  
  29. disp('.................................................')  
  30. voting=zeros(1,npersons);  
  31. for i=1:npersons-1  
  32.     for j=i+1:npersons  
  33.         class=svmclassify(multiSVMstruct{i}{j},scaledtestface);  
  34.         voting(i)=voting(i)+(class==1);  
  35.         voting(j)=voting(j)+(class==0);  
  36.     end  
  37. end  
  38. [~,class]=max(voting);  
  39. set(edit2,'string','识别完成!')  
  40. drawnow  
  41. axes(h_axes2);  
  42. imshow(imread(['E:\ORL_face\s',num2str(class),'\1.pgm']));  
  43. msgbox(['样本识别为第',num2str(class),'个人'])  

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