matlab实现人脸识别

来源:互联网 发布:小学生必读书目 知乎 编辑:程序博客网 时间:2024/06/09 19:03

前面在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

训练图像如下:


识别结果:





0 0