前面在python学习中实现了人脸检测,下面我将在matlab中实现人脸识别。
人脸识别技术中被广泛采用的区域特征分析算法,它融合了计算机图像处理技术与生物统计学原理于一体,利用计算机图像处理技术从视频中提取人像特征点,利用生物统计学的原理进行分析建立数学模型,即人脸特征模板。利用已建成的人脸特征模板与被测者的人的面像进行特征分析,根据分析的结果来给出一个相似值。通过这个值即可确定是否为同一人。 基本算法:
1.基于人脸特征点的识别算法(Feature-based recognition algorithms);
2.基于整幅人脸图像的识别算法(Appearance-based recognition algorithms);
3.基于模板的识别算法(Template-based recognition algorithms);
4.利用神经网络进行识别的算法(Recognition algorithms using neural network);
5.利用线性回归进行识别的算法;
6.利用稀疏表示进行识别的算法;
人脸识别主要包括四个方面:人脸采集----图像预处理-------人脸特征提取--------匹配与识别。
对于任何人脸识别方法来说,最难的都是第四步。这里主要用最小距离法,寻找和待识别图片最为接近的训练图片。思路是:思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。
下面是操作过程:
一:在线获取100张128*128的灰度人脸图像。
vid = videoinput('winvideo',1);
for i=1:100
pause(0.5);
frame = getsnapshot(vid);
img=rgb2gray(ycbcr2rgb(frame));
img=imresize(img,[128,128]);
path=strcat(strcat('.\train\',num2str(i)),'.bmp');
imwrite(img,path);
end
stop(vid);
delete(vid);
close all
二,训练(一)中得到的人脸图像
global cankao
global W
global img_pj
global wts
global path
global img_path
% 批量读取指定文件夹下的图片128*128
path = uigetdir;
img_path = dir(strcat(path,'\*.bmp'));
img_num = length(img_path);
imagedata = [];
if img_num >0
for j = 1:img_num
img_name = img_path(j).name;
temp = imread(strcat(path, '/', img_name));
temp = double(temp(:));
imagedata = [imagedata, temp];
end
end
wts = size(imagedata,2);
% 中心化 & 计算协方差矩阵
img_pj = mean(imagedata,2);
for i = 1:wts
imagedata(:,i) = imagedata(:,i) - img_pj;
end
covMat = imagedata'*imagedata;
[COEFF, latent, explained] = pcacov(covMat);
% 选择构成95%能量的特征值
i = 1;
proportion = 0;
while(proportion <95)
proportion = proportion + explained(i);
i = i+1;
end
p = i - 1;
% 特征脸
W = imagedata*COEFF; % N*M阶
W = W(:,1:p); % N*p阶
% 训练样本在新座标基下的表达矩阵 p*M
cankao = W'*imagedata;
msgbox(['训练完成'])
三,读取图像并识别
global im
global cankao
global W
global imgpj
global wts
global path
global img_path
im = double(im(:));
objectOne= W'*(im - imgpj);
distance = 100000000;
for k = 1:wts
temp = norm(objectone - cankao(:,k));
if(distance>temp)
aimOne= k;
distance = temp;
aimpath = strcat(path, '/', img_path(aimone).name);
axes( handles.axes2 )
imshow(aimpath)
end
end