目录

一、前言

二、相关程序

(一)主函数

(二)图库生成函数

(三)图库图像命名函数

(四)待识别图库生成函数

(五)待识别图库命名函数

(六)图像数据导入函数

(七)PCA简单主成分分析函数

(八)图像匹配函数

三、识别效果


一、前言

近期,要做一个人脸识别的课题,于是在前人的基础上做了一些。对于图像处理我还属于初学阶段,在人脸识别算法上没有采用很高级的算法。

参考的文章:

利用MATLAB截取图片某个区域_蓝天萝卜-CSDN博客

Matlab实现人脸识别_王小壮的博客-CSDN博客_matlab人脸识别

MATLAB中cell(元胞)数组的基本用法_脉望虫的博客-CSDN博客_matlab中cell函数

程序的主思路是:

1.首先确定两张待检测图片,一张图(图1)作为生成的图库使用,另外一张(图2)作为目标图片进行识别,一般来讲,图1中的人脸数要多余图2中的人脸数,否则可能会导致重复识别。

2.对与图片中人脸的检索用matlab自带的vision.CascadeObjectDetector()函数检测照片上的图片(vision.CascadeObjectDetector()的用法参见之前发的一篇博客:基于matlab实现的人脸检测_xiaolizi_331的博客-CSDN博客)

3.将图1和图2中的图片检测出以后,对图像进行分割转化,存入元胞数组中,以便进行下一步数据分析。

4.是图像识别的核心部分,采用简单主成分分析算法和范数将目标图片与图库中最接近目标图片的图进行匹配,完成人脸识别。

二、相关程序

(一)主函数

ori_pic=imread('yangliwei.jpeg');
lib_pic=imread('hangtianyuan.jpeg');
[facebox_aim,pic_cell_aim]=aim_face(ori_pic);
[facebox_lib,pic_cell_lib,file_name]=lib_face(lib_pic);
%%
%%定义目标个数
n_f=size(pic_cell_aim,2);%定义目标图像个数
for i=1:n_f
img=imgdata(file_name); %图片矩阵数据
Cell_ten=PCA(img,2);% 调用PCA函数
pic_aim=cell2mat(pic_cell_aim(i)); %将元胞数组转为矩阵不然会报错
face1=facefind(Cell_ten,pic_aim);
figure,subplot(1,2,1)
imshow(pic_aim)
title('目标图像')
subplot(1,2,2)
imshow(strcat(num2str(face1),'.jpg'))
title('自建库中图像')
end

(二)图库生成函数

function  [facebox_lib,pic_cell_lib,file_name]=lib_face(lib_pic)
faceDetector = vision.CascadeObjectDetector(); % 构造检测器对象。
%lib_pic = imread('hangtianyuan.jpeg'); % 读取包含面部的图像。
facebox_lib = step(faceDetector, lib_pic); % 开始检测,将结果存储到facebox变量中
finalImage = insertShape(lib_pic, 'Rectangle', facebox_lib,'LineWidth',5);
figure; imshow(finalImage);
%% =================================
% pic = imread('face2.png');
% imshow(pic);
n_lib=size(facebox_lib,1);
local=zeros(n_lib,4);local(:,1)=facebox_lib(:,1);local(:,2)=facebox_lib(:,1)+facebox_lib(:,3);local(:,3)=facebox_lib(:,2);local(:,4)=facebox_lib(:,2)+facebox_lib(:,3);
%%pic_1 = imcrop(lib_pic,[local(1,1),local(1,3),abs(local(1,2)-local(1,1)),abs(local(1,3)-local(1,4))]);file_name=file_num(n_lib);
pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小
figure,imshow(pic_n);
pic_cell_lib={pic_n};
imwrite(pic_1,file_name(1,:),'BitDepth',8);for i=2:n_lib
%[x,y] = ginput(2);    %确定图像上的两点利用ginput函数,返回值是两点的坐标
pic_1 = imcrop(lib_pic,[local(i,1),local(i,3),abs(local(i,2)-local(i,1)),abs(local(i,3)-local(i,4))]);
%利用imcrop函数对图像进行切割,输入参数是一个定点坐标,
%从该定点出发向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的区域进行切割
pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小
figure,imshow(pic_n);
pic_cell_lib=[pic_cell_lib,pic_n];
imwrite(pic_n,file_name(i,:),'BitDepth',8);

(三)图库图像命名函数

function A1=file_num(n)
A1 = [49 46 106 112 103];
A1=char(A1);
for i=1:n-1
A2 = [i+49 46 106 112 103];%asc码值
A1=char(A1,A2);
end
end

(四)待识别图库生成函数

function  [facebox_aim,pic_cell_aim]=aim_face(ori_pic)
faceDetector = vision.CascadeObjectDetector(); % 构造检测器对象。
%image = imread('yangliwei.jpeg'); % 读取包含面部的图像。
facebox_aim = step(faceDetector, ori_pic); % 开始检测,将结果存储到facebox变量中
finalImage = insertShape(ori_pic, 'Rectangle', facebox_aim,'LineWidth',5);
figure; imshow(finalImage);
%% ===============================================================
% pic = imread('face2.png');
% imshow(pic);
n_aim=size(facebox_aim,1);
local=zeros(n_aim,4);local(:,1)=facebox_aim(:,1);local(:,2)=facebox_aim(:,1)+facebox_aim(:,3);local(:,3)=facebox_aim(:,2);local(:,4)=facebox_aim(:,2)+facebox_aim(:,3);
%%
pic_1 = imcrop(ori_pic,[local(1,1),local(1,3),abs(local(1,2)-local(1,1)),abs(local(1,3)-local(1,4))]);
pic_cell_aim={pic_1};
file_name_aim=aim_name(n_aim);
pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小
figure,imshow(pic_n);
imwrite(pic_1,file_name_aim(1,:),'BitDepth',8);for i=2:n_aim
%[x,y] = ginput(2);    %确定图像上的两点利用ginput函数,返回值是两点的坐标
pic_1 = imcrop(ori_pic,[local(i,1),local(i,3),abs(local(i,2)-local(i,1)),abs(local(i,3)-local(i,4))]);
%利用imcrop函数对图像进行切割,输入参数是一个定点坐标,
%从该定点出发向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的区域进行切割
pic_cell_aim=[pic_cell_aim,pic_1];
pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小
figure,imshow(pic_n);
imwrite(pic_n,file_name_aim(i,:),'BitDepth',8);
end

(五)待识别图库命名函数

function A1=aim_name(n)
A1 = [97 105 109 95 110 97 109 101 49 46 106 112 103];
A1=char(A1);
for i=1:n-1
A2 = [97 105 109 95 110 97 109 101 i+49 46 106 112 103];%asc码值
A1=char(A1,A2);
end
end

(六)图像数据导入函数

%--------------函数说明-------------
%    整合输入的人脸样本
%    输出:样本矩阵
%-----------------------------------
% function ImgData = imgdata()
%用法:  ImgData = imgdata();  %分别导入图片
%% =======================================
function ImgData=imgdata(file_name)
%% file_name
nn=size(file_name,1);
%%
namud = 0.5;   %原始图片缩小倍数
pic_N=imread(file_name(1,:));pic_N=imresize(pic_N,[100 100]);pic_N=imresize(pic_N,namud);
pic_N=rgb2gray(pic_N);
pic_all={pic_N};
for i=2:nnpic_N=imread(file_name(i,:));pic_N=rgb2gray(pic_N);pic_N=imresize(pic_N,[100 100]);%将所有图片转到100*100大小pic_N=imresize(pic_N,namud);[m,n] = size(pic_N);  %取图片大小
pic_all=[pic_all,pic_N];
end
%% ====================================================
for i=1:nn %把m*n的矩阵变换成1*(m*n)的矩阵  ImgData(i,:) = reshape(pic_all{i},1,m*n);
end
%讲数据范围缩小到0到1之间
ImgData = double(ImgData)/255;  

(七)PCA简单主成分分析函数

%-----简单主成分分析算法
%-----输入:样本集合矩阵:img
%           降维的维数 :k
%-----输出:细胞结构体数据 :Cell_all
%-----------------------------------
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};

(八)图像匹配函数

%-----人脸匹配
%-----输入:细胞结构体数据Cell_all(包括样本集合,特征值与特征向量)
%           想要识别的人脸(彩色图像)
%-----输出:匹配的结果
%-----------------------------------
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 = imresize(pic,[100 100]);
pic = imresize(pic,namud);  %变换大小
[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
%找到其中最近的就认为是所要识别的人脸
E=min(error);
if E>10return
end
FaceFind = find(error == min(error));  % FaceFind = error;

三、识别效果

原图库图像:

人脸检测后:

分割后图片:

目标图像:

人脸检测后:

图像分割后:

图像匹配,完成图片识别:

有什么问题的小伙伴可以评论见

图像处理——matlab人脸识别(1)相关推荐

  1. 基于matlab人脸识别论文,毕业论文--基于MATLAB的人脸识别系统设计

    毕业论文--基于MATLAB的人脸识别系统设计 毕毕 业业 设设 计计 论论 文文 题 目 基于 MATLAB 的人脸识别系统设计 学 院 电气与信息工程学院 专 业 自动化 I 摘要 人脸识别是模式 ...

  2. MATLAB人脸识别疫情防护门禁系统GUI设计与实现

    题目名称:MATLAB人脸识别疫情防护门禁系统 课题介绍:该系统为基于MATLAB的疫情防护门禁系统.建立一个GUI可视化界面,将疑似病例录入进人脸库,对其进行训练.测试的时候,采集一张全身照人脸图片 ...

  3. 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  4. MATLAB人脸识别疫情防护门禁系统

    题目名称:MATLAB人脸识别疫情防护门禁系统 课题介绍:该系统为基于MATLAB的疫情防护门禁系统.建立一个GUI可视化界面,将疑似病例录入进人脸库,对其进行训练.测试的时候,采集一张全身照人脸图片 ...

  5. MATLAB人脸识别系统设计与仿真【GUI解界面】

    MATLAB人脸识别系统设计与仿真[GUI解界面] 第一章 绪论 本章提出了本文的研究背景及应用前景.首先阐述了人脸图像识别意义:然后介绍了人脸图像识别研究中存在的问题:接着介绍了自动人脸识别系统的一 ...

  6. 基于Matlab人脸识别签到系统(GUI界面)

    文件大小:5.3M 代码行数:298行(主程序) 开发环境:Matlab2016.2017.2018.2020.2021 点击下载:点击下载 简要概述:基于Matlab人脸识别签到系统(GUI界面) ...

  7. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  8. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  9. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  10. 标识人脸程序matlab,Matlab人脸识别基础源程序

    [实例简介] 功能为在图片中查找是否存在人脸,如果存在将其通过方框标识. 整体过程为:拍照保存--->将RGB照片转换为灰度照片--->数字图像处理提取特征--->人脸识别 [实例截 ...

最新文章

  1. 一体广告机实现思路,非常实用(二)
  2. 【NLP】CS224N课程笔记|词向量I: 简介, SVD和Word2Vec
  3. 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)
  4. 对于一个管理性的软件来讲,数据主键的产生策略是很关键的一点,这个关系到整个系统的基础架构思想。...
  5. Codeforces940(A-F)
  6. java有password_hash吗,java 实现 PHP password_hash() password_verify() 单向验证
  7. 计算与推断思维 翻译完成
  8. swagger的使用(com.spring4all)
  9. Android OpenGL 开发
  10. Python PyQt5在Windows平台安装
  11. 24年未遇之奇景再等等 Intel旗舰显卡曝5-6月发布
  12. MFC 控件清除内存
  13. Windows 7 64位版本的内存错误导致蓝屏死机(Blue Screen to Death)
  14. Java应用中CPU使用率过高该怎么解决
  15. Briefings in bioinformatics2021 | MolGNet+:基于分子全局表征的高效自监督框架,用于药物发现
  16. 7-9 幂集(回溯法) (20 分)(C语言版)
  17. 一款Img图床模板码 扩展性超强纯Html+响应式
  18. Chrome打开网页不慢,但是卡顿,滚动滚轮卡顿,打开b站等特定网址卡顿问题解决
  19. Win7下安装Ubuntu16.04成双系统
  20. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

热门文章

  1. Activiti6驳回上一节点
  2. python分布式定时任务_分布式定时任务框架——python定时任务框架APScheduler扩展...
  3. endnote X7使用方法
  4. win10备份为wim_在PE中使用CGI进行系统备份和还原
  5. 阿里巴巴数据中台实践(PPT)
  6. linux oracle ora-00257,Oracle数据库的ORA-00257故障解决过程
  7. 2022大连理工887软件工程初试
  8. 红色警戒 direct错误
  9. yahoo也推出站点统计了
  10. SubSonic的配置及运用