当前位置: 代码迷 >> 综合 >> PCA 实现人脸识别之宿舍
  详细解决方案

PCA 实现人脸识别之宿舍

热度:5   发布时间:2023-10-25 15:06:47.0

程序逻辑:

Load_database

%     每张图片大小为:112*92=10304 一共92张图片 v 用来存放face 数据v=zeros(10304,80);for i=1:8%进入对应的路径 s1 s2...cd(strcat('s',num2str(i)));for j=1:10a=imread(strcat(num2str(j),'.png'));%将图片数据 reshape 成 a行 单列的数据v(:,(i-1)*10+j)=reshape(a,size(a,1)*size(a,2),1);end
%         向外退出一层cd ..end

变量说明:

v:用来存储所有图片的数据,由于图片是gray(灰度的),所以每个图片的像素大小等于 图片的长度*图像的宽度=112*92=10304

然而图片是二维的数据,这里为了存储,将其reshape 为: 10304行 1列的列元素;

所以v  变量是 10304行 80列的数组,其中每一列代表一个图像;一共80张图片

所以load database返回的数据是 v 所有图片的数据

init data函数的作用:

该函数主要的作用是,按照论文的公式得到对应的特征向量,

cv=zeros(size(v,2),N);
for i=1:size(v,2)cv(i,:)=single(vzm(:,i))'*V;    % Each row in cv is the signature for one image.
endend

变量的说明:

cv: cv 是从v 中的图像中得到的特征向量

cv 的行数是 80 也就是80张图片;

cv 的列数是N :特征向量的个数

所以 cv 的每一行对应着 照片的特正向量

图像处理:

%图像读取
fac=imread(path);
r=reshape(fac,10304,1);
%% Recognition 
%  Now, we run the algorithm and see if we can correctly recognize the face. p=r-m;  % Subtract the mean
s=single(p)'*V;
z=[];
for i=1:size(v,2)z=[z,norm(cv(i,:)-s,2)];if(rem(i,20)==0)axes(handles.axes1);imshow(reshape(v(:,i),112,92))enddrawnow;
end[a,i]=min(z);
%显示在下面
index=ceil(i/10);

fac 是读取的一张人脸

r  是将人脸reshape 成一列数据

s: 是将图片按照论文的方式提取到的特征值

z:  z的作用是 在循环体中,遍历所有的 80张图片,求读取图片得到的特征值和每张人脸特征值之间的 欧几里得距离,即 第二范数;距离越小代表越相近;

然后选择最小的,人为是本人

  相关解决方案