最简单的人脸识别

来了来了
代码贴出:网络上的其他版本bug很模糊,这份笔记贴进软件就能实现

介绍啊!
这一步是解决数据读取问题,将数据导入

%文件1
function ImgData = imgdata()
%用法:  ImgData = imgdata();
%分别导入图片
pic1 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\face1.jpg')); pic1 = imresize(pic1,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
pic2 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\face2.jpg')); pic2 = imresize(pic2,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
pic3 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\face3.jpg')); pic3 = imresize(pic3,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
pic4 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\face4.jpg')); pic4 = imresize(pic4,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
pic5 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\face5.jpg')); pic5 = imresize(pic5,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
pic6 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\face6.jpg')); pic6 = imresize(pic6,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
pic7 =  rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\kuanleung.jpg')); pic7 = imresize(pic7,[150,150]);%读取转换为灰度值图片,尺寸大小设置为长150,宽150
[m,n] = size(pic1);  %取图片大小
% 下面采用一个细胞体结构的数据类型存储多个矩阵
pic_all = {pic1,pic2,pic3,pic4,pic5,pic6,pic7};%放入同一个细胞体中
for i=1:7 %这个参数是pic_all的大小,为7
    %把m*n的矩阵变换成1*(m*n)的矩阵
    ImgData(i,:) = reshape(pic_all{i},1,m*n);
end
%讲数据范围缩小到01之间
ImgData = double(ImgData)/255; %输出预处理的图片
%文件2
function FaceFind = facefind(Cell_all,img2find)
%细胞结构体的调用
img_all = Cell_all{1};
[m1,n1] = size(img_all);
V = Cell_all{2};
D = Cell_all{3};
%namud = 0.5;  %图片缩小的倍数
%对需要识别的图像进行灰度等的处理
%pic = rgb2gray(img2find);  %灰度处理
pic = img2find
pic = imresize(pic,[150,150]);  %变换大小
[m2,n2] = size(pic); 
pic = reshape(pic,1,m2*n2);  %重新排列
pic = double(pic)/255;       
pic_done = pic*V*D;  %处理完的数据
%% 归一化  --》避免运算出现特别大的数据
Ma = max(max(pic_done));
Mi = min(min(pic_done));
pic_done = pic_done/(Ma - Mi);
%%
for i=1:m1
    % 归一化  --》避免运算出现特别大的数据
    Ma1 = max(img_all(i,:));
    Mi1 = min(img_all(i,:));
    img_all(i,:) = img_all(i,:)/(Ma1 - Mi1);
    %求范数--》把他们之间的几何距离作为评判与哪一个人脸最近的标准
    error(i) = norm(img_all(i,:)-pic_done);
end
%找到其中最近的就认为是所要识别的人脸
FaceFind = find(error == min(error));
% FaceFind = error;

这个函数是算法函数,主成分分析,提取人脸特征的主要成分,在通过FaceFind函数进行误差匹配。

%文件3
function Cell_all = PCA(img,k)
%reshape函数:改变句矩阵的大小,矩阵的总元素个数不能变
%img = [1,2;2,1;3,3;3,6;6,3];
% k = 2;
% img = double(img);
[m,n] = size(img);  %取大小
img_mean = mean(img); %求每列平均值
img_mean_all = repmat(img_mean,m,1);%复制m行平均值至整个矩阵
Z = img - img_mean_all;
T = Z'*Z;%协方差矩阵    
[V,D] = eigs(T,k);%计算T中最大的前k个特征值与特征向量
img_new = img*V*D;  %低维度下的各个脸的数据
Cell_all = {img_new,V,D};

这个是主函数,调用所有的功能函数

%文件4
%开始调用
pic8 = rgb2gray(imread('D:\个人文件\脚本文件\matlab\facemodels\faceres\kunleung_shiyan.jpg')); ic8 = imresize(pic8,[150,150]);%读取要识别的图像,进行重新尺寸设置为长150,宽150
ImgData = imgdata()
k = 3    %提取主成分的数量
Cell_all = PCA(ImgData,k)
FaceFind = facefind(Cell_all,pic8)   %进行误差匹配,选择误差最小的
%imshow(FaceFind,[])

图像库:
在这里插入图片描述
本人头像就不贴了
注意:识别物体,如水杯,效果不佳

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜗笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值