1.“读取图片”按钮
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%% 读取待查找图片
global im;%由于要在两个按钮函数中使用,故使用全局变量
[filename, pathname]=...
uigetfile({'*.bmp'},'选择图片');
str = [pathname, filename];%合成路径+文件名
im = imread(str);%读取图片
axes( handles.axes1);%使用第一个axes
imshow(im);title('待查找')%显示图片
2.“开始查找”按钮
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%% PCA人脸识别
global im;%使用全局变量
imgdata=[];%训练图像矩阵
for i=1:10
for j=1:5
a=imread(strcat('C:\Users\dell\Desktop\ORL\s',num2str(i),'\',num2str(j),'.bmp'));
b=a(1:112*92); % b是行矢量 1×N,其中N=10304
b=double(b);
imgdata=[imgdata; b]; % imgdata 是一个M * N 矩阵,imgdata中每一行数据一张图片,M=50
end;
end;
imgdata=imgdata'; %每一列为一张图片
imgmean=mean(imgdata,2); % 平均图片,N维列向量
for i=1:50
minus(:,i) = imgdata(:,i)-imgmean; % minus是一个N*M矩阵,是训练图和平均图之间的差值
end;
covx=minus'* minus; % M * M 阶协方差矩阵
[COEFF, latent,explained] = pcacov(covx'); %PCA,用协方差矩阵的转置来计算以减小计算量
% 选择构成95%的能量的特征值
i=1;
proportion=0;
while(proportion < 95)
proportion=proportion+explained(i);
i=i+1;
end;
p=i-1;
% 训练得到特征脸坐标系
i=1;
while (i<=p && latent(i)>0)
base(:,i) = latent(i)^(-1/2)*minus * COEFF(:,i); % base是N×p阶矩阵,用来进行投影,除以latent(i)^(1/2)是对人脸图像的标准化
i = i + 1;
end
% 将训练样本对坐标系上进行投影,得到一个 p*M 阶矩阵为参考
reference = base'*minus;
%% 测试过程——在测试图片文件夹中选择图片,进行查找测试
a=im;
b=a(1:10304);
b=double(b);
b=b';
object = base'*(b-imgmean);
distance=100000;
%最小距离法,寻找和待识别图片最为接近的训练图片
for k=1:50
temp= norm(object - reference(:,k));
if (distance > temp)
which = k;
distance = temp;
end;
end;
%找出距离最近的图片所在的位置
num1 = ceil(which/5);%第num1个文件夹
num2 = mod(which,5);%第num2个图片文件
if (num2 == 0)
num2 = 5;
end;
I=imread(strcat('C:\Users\dell\Desktop\Face\s',num2str(num1),'\',num2str(num2),'.bmp'));%读取该图片
axes( handles.axes2);%使用第2个axes
%输出判断所最接近的训练样本的人脸图片并显示其人名
switch num1
case 1
imshow(I);title('此人为 Peter');%显示图片及人名
case 2
imshow(I);title('此人为 Ben');
case 3
imshow(I);title('此人为 Nick');
case 4
imshow(I);title('此人为 Park');
case 5
imshow(I);title('此人为 Linkin');
case 6
imshow(I);title('此人为 Andy');
case 7
imshow(I);title('此人为 Arthur');
case 8
imshow(I);title('此人为 Lisa');
case 9
imshow(I);title('此人为 Dana');
case 10
imshow(I);title('此人为 Sara');
end;
3.“退出”按钮
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%% 退出
close(gcf);