今天同学让我帮忙制作一个人脸表情识别的样本库,其中主要是对人脸进行裁剪,这里用到了一个相对较新的Matlab人脸检测方法Face Parts Detection,网上百度了一下发现关于Matlab人脸检测的代码和资源并不多,故此专门撰写一篇博客来详细介绍这个人脸检测方法的用途。

一、下载对应的工具包

首先下载对应的工具包,matlab最方便的地方莫过于此了,直接下载、配置简单、并且可以查看源码,这里给出对应的工具包下载地址:Face Parts Detection工具包。

点击“Download Zip”下载按钮开始下载,下载完成后解压,得到如下文件:

二、配置工具包

下载完成后开始配置工具箱。首先需要强调一点,这个方法需要依赖两个Matlab图像处理方面的工具箱Image Processing Toolbox和Computer Vision System Toolbox,几乎所有版本的Matlab都默认集成了Image Processing工具箱,但对于Computer Vision System工具箱只有相对较高版本(Matlab2013及以上)的Matlab版本才进行了集成,因此如果在程序执行过程中提示缺少对应的工具箱,则需要手动进行配置Computer Vision System。

假设Matlab已经配置好了以上两个工具箱,接下来开始配置Face Parts Detection工具包,方法极其简单,只需在Set Path对话框中将当前工具箱的文件夹(这里是Face_detection_Parts文件夹)路径添加到系统的搜索路径即可:

三、进行批量人脸检测

工具箱配置完成后开始利用其进行人脸检测。

3.1、批量读取图片

首先,需要对数据库中的图像进行批量读取,读取完之后再进行人脸检测。首先给出批量读取的代码,稍后解释:

clear;

stImageFilePath= 'E:\CAS-PEAL-R1(1)\CAS-PEAL-R1\FRONTAL\Expression\';

stImageSavePath = 'E:\Face_Detection\';

dirImagePathList = dir(strcat(stImageFilePath,'*.tif')); %读取该文件夹下所有图片的路径(字符串格式)

iImageNum= length(dirImagePathList); %获取图片的总数量if iImageNum > 0 %批量读入图片,进行五官检测,再批量检测for i = 1: iImageNum

iSaveNum=int2str(i);

stImagePath=dirImagePathList(i).name;

mImageCurrent=imread(strcat(stImageFilePath,stImagePath));end

end

这里采用dir()函数的方法来读取目录下所有文件的文件名,dirImagePathList(i).name中保存了文件夹下的所有文件的名称。有关Matlab中dir()函数的用法大家可以参考网络资料。stImageFilePath变量保存了当前图片所在文件夹的路径(这里为E:\CAS-PEAL-R1(1)\CAS-PEAL-R1\FRONTAL\Expression\),stImageSavePath变量指定了裁剪之后的人脸图像的保存路径。这里需要注意的一点就是保存裁剪结果的文件夹需要事先创建好(或者在程序中通过mkdir等函数来提前创建)。通过strcat()函数来判断当前图像名称中是否包含“.tif”来确定其是否为图像文件(这里的数据库中的图像文件都是tif格式的),

3.2、编写人脸检测函数

批量读取图像完成后,开始进行人脸检测,这里选择将人脸检测封装为一个脚本文件方便调用,这里暂且将其命名为face_segment.m文件。

首先,需要判断当前图像的通道数,因为Face Parts Detection方法只能针对三通道图像进行人脸检测,如果当前图像为灰度图(单通道图),则需要先将其转换为三通道矩阵形式:

%%%%%%%%%%%%%%%%%%%%将灰度图变为三通道图%%%%%%%%%%%%%%%%%%%%

if(size(mImageSrc,3) == 1)

mImage2detect(:,:,1) =mImageSrc;

mImage2detect(:,:,2) =mImageSrc;

mImage2detect(:,:,3) =mImageSrc;elsemImage2detect=mImageSrc;

end

然后开始调用工具箱进行人脸检测,就两句代码即可(可见作者将程序封装得何其之好):

%%%%%%%%%%%%%%%%%%%%对图像进行人脸检测%%%%%%%%%%%%%%%%%%%%FaceDetector=buildDetector();

[bbox,bbimg,faces,bbfaces]= detectFaceParts(FaceDetector,mImage2detect,2);

对于bbox,bbimg,faces,bbfaces这四个检测结果的具体含义,在detectFaceParts.m文件的开头部分作者给出了详细的解释,我们这里只用到bbox这个变量,它里面分别保存了所检测出的人脸区域(一个矩形框)的左上角坐标以及宽度和高度。

检测完成之后,再统一将图像转换为灰度图,保证格式的统一,方便保存:

%%%%%%%%%%%%%%%%%%%%输入图像灰度化%%%%%%%%%%%%%%%%%%%%

if 1 ~= size(mImageSrc,3)

mImageSrc=rgb2gray(mImageSrc);

mImageSrc=double(mImageSrc);

elseif1 == size(mImageSrc,3)

mImageSrc=double(mImageSrc);

end

接下来开始对人脸区域进行分割。这个有两种分割策略,一种是直接使用检测到的人脸框bbox对原图进行截取,在不可控的采集条件下只能用这种方法来分割人脸;第二种策略是针对人脸框bbox首先确定人脸区域的中心点,然后再以中心点为基准向四周按照一定比例进行外扩,这种方法仅适合采集条件严格可控、人脸大致对齐的人脸数据库,恰好我们所处理的数据库满足这种要求,因此在这里采用第二种策略进行人脸区域分割,代码如下:

%%%%%%%%%%%%%%%%%%%%得到人脸区域框的中心点%%%%%%%%%%%%%%%%%%%%recFace.x= bbox(1,1);

recFace.y= bbox(1,2);

recFace.width= bbox(1,3);

recFace.height= bbox(1,4);

ptFaceCenter.x= recFace.x + recFace.width / 2;

ptFaceCenter.y= recFace.y + recFace.height / 2;%%%%%%%%%%%%%%%%%%%%以中心点为基准进行外扩(即对人脸选框进行调整)%%%%%%%%%%%%%%%%%%%%recFace.x= ptFaceCenter.x - recFace.width * 0.4;

recFace.y= ptFaceCenter.y - recFace.height * 0.35;

recFace.width= recFace.width * 0.8;

recFace.height= recFace.height * 0.8;

mFaceResult= uint8(imcrop(mImageSrc,[recFace.x,recFace.y,recFace.width,recFace.height]));

这里只涉及到了简单的几何知识,因此不再赘述,确定好人脸矩形区域之后,使用imcrop()函数进行区域分割。这里给出face_segment.m文件的完整代码:

%===============================================================================

%函数名称:face_segment%输入参数:mImageSrc,待分割的人脸图像,可能是灰度图像,也可能是彩色图像%输出参数:mFaceResult,分割后的人脸结果,应为灰度图像%主要步骤:1)进行人脸检测,得到脸部区域的框框% 2)得到脸部图像框的中心点% 3)根据中心点,对图像进行等比例外扩,得到合适大小的人脸图像%注意事项:1)首先需要判断该图像是否为灰度图,若为灰度图,需要先将其转换为三通道彩色图%===============================================================================function mFaceResult=face_segment(mImageSrc)%%%%%%%%%%%%%%%%%%%%将灰度图变为三通道图%%%%%%%%%%%%%%%%%%%%

if(size(mImageSrc,3) == 1)

mImage2detect(:,:,1) =mImageSrc;

mImage2detect(:,:,2) =mImageSrc;

mImage2detect(:,:,3) =mImageSrc;elsemImage2detect=mImageSrc;

end%%%%%%%%%%%%%%%%%%%%对图像进行人脸检测%%%%%%%%%%%%%%%%%%%%FaceDetector=buildDetector();

[bbox,bbimg,faces,bbfaces]= detectFaceParts(FaceDetector,mImage2detect,2);%%%%%%%%%%%%%%%%%%%%输入图像灰度化%%%%%%%%%%%%%%%%%%%%

if 1 ~= size(mImageSrc,3)

mImageSrc=rgb2gray(mImageSrc);

mImageSrc=double(mImageSrc);

elseif1 == size(mImageSrc,3)

mImageSrc=double(mImageSrc);

end%%%%%%%%%%%%%%%%%%%%得到人脸区域框的中心点%%%%%%%%%%%%%%%%%%%%recFace.x= bbox(1,1);

recFace.y= bbox(1,2);

recFace.width= bbox(1,3);

recFace.height= bbox(1,4);

ptFaceCenter.x= recFace.x + recFace.width / 2;

ptFaceCenter.y= recFace.y + recFace.height / 2;%%%%%%%%%%%%%%%%%%%%以中心点为基准进行外扩(即对人脸选框进行调整)%%%%%%%%%%%%%%%%%%%%recFace.x= ptFaceCenter.x - recFace.width * 0.4;

recFace.y= ptFaceCenter.y - recFace.height * 0.35;

recFace.width= recFace.width * 0.8;

recFace.height= recFace.height * 0.8;

mFaceResult=uint8(imcrop(mImageSrc,[recFace.x,recFace.y,recFace.width,recFace.height]));

end

四、人脸批量保存

在完成人脸检测函数之后,开始对人脸进行检测分割和批量保存,这里直接给出代码:

clear;

stImageFilePath= 'E:\CAS-PEAL-R1(1)\CAS-PEAL-R1\FRONTAL\Expression\';

stImageSavePath = 'E:\Face_Detection\';

dirImagePathList = dir(strcat(stImageFilePath,'*.tif')); %读取该文件夹下所有图片的路径(字符串格式)

iImageNum= length(dirImagePathList); %获取图片的总数量if iImageNum > 0 %批量读入图片,进行五官检测,再批量检测for i = 1: iImageNum

iSaveNum=int2str(i);

stImagePath=dirImagePathList(i).name;

mImageCurrent=imread(strcat(stImageFilePath,stImagePath));

mFaceResult=face_segment(mImageCurrent);

imwrite(mFaceResult,strcat(stImageSavePath,iSaveNum,'.bmp')); end end

这段代码的逻辑相对简单,调用strcat()字符串拼接函数来完成检测结果的自动命名,考虑到版权问题,这里不粘贴最终的人脸分割结果,但程序亲测可用,没有问题。

五、注意事项

1、OpenCv人脸检测函数

进行人脸检测是Matlab并不是唯一选择,OpenCv也同样封装的人脸检测函数,不过OpenCv中封装的人脸检测函数是基于AdaBoost算法,相对经典而古老,性能不如本文中所介绍的人脸检测算法,并且OpenCv在读取tif格式的图像文件时显得异常麻烦。

2、原理介绍

在这篇博文中我们只介绍了Face Parts Detection算法的具体用法,至于去人脸检测原理,将来有时间了我再专门写博文进行介绍。

3、打不开MathWork官网的话我可以给发邮箱

如果出现不能正常登陆MathWork网站,无法下载工具箱的情况,可以给我发邮件,我会抓时间提供相应的工具箱

4、灰度图不等于单通道图

在这里再强调一个小问题,就是灰度图与单通道图的关系,理论上来说这两个名词完全属于不同的概念,灰度图不一定是单通道图,因为三个通道的RGB值均相等的三通道图在视觉上同样变现为灰度图,不过单通道图肯定是灰度图。

如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。

matlab中facedetector,Matlab人脸检测方法(Face Parts Detection)详解相关推荐

  1. 漏洞检测方法如何选?详解源代码与二进制SCA检测原理

    摘要:本文探讨的是SCA具体的检测原理,源代码SCA检测和二进制SCA检测有哪些相同点和不同点,在进行安全审计.漏洞检测上各自又有什么样的优势和适用场景. 本文分享自华为云社区<源代码与二进制文 ...

  2. 枚举Windows进程中模块的几种方法-PEB内核结构详解

    1. 引言 在诸多的场景中(例如软件测试,软件安全研究等领域)经常需要分析在目标进程中具体加载了哪些模块(DLL),以及所加载的模块的信息(如模块基地址,映射文件大小等).获取这windows进程加载 ...

  3. ip iq 谐波检测matlab仿真,基于Matlab的低压电力系统谐波检测方法仿真研究

    基于Matlab的低压电力系统谐波检测方法仿真研究 1 前言 随着科学技术的发展,随着工业生产水平和人民生活水平的提高,非线性用电设备在电网中大量投运,造成了电网的谐波分量占的比重越来越大.它不仅增加 ...

  4. matlab中随机函数的具体使用方法

    matlab中随机函数的具体使用方法如下: rand(n):生成0到1之间的n阶随机数方阵 rand(m,n):生成0到1之间的m×n的随机数矩阵 (现成的函数) 另外: Matlab随机数生成函数 ...

  5. matlab中hold all,matlab中hold on的使用方法

    matlab中hold on的使用方法 发布时间:2020-08-15 14:01:54 来源:亿速云 阅读:107 作者:小新 小编给大家分享一下matlab中hold on的使用方法,希望大家阅读 ...

  6. 在MATLAB中生成矩阵的三种方法

    在MATLAB中生成矩阵的三种方法 1. 直接输入法 2. 外部文件读入法 3.特殊矩阵函数生成法 1. 直接输入法 (1)矩阵所有元素必须在[]内 (2)矩阵中同行元素以逗号','或空格分隔 (3) ...

  7. MATLAB中函数find的使用方法概述,简单易懂+例子

    MATLAB中函数find的使用方法总结+探索,简单易懂+例子 该函数不仅可以查找矩阵获这向量中的非零元素的位置,也可以查询满足一定逻辑条件的元素位置. find函数总共的适用方法 index = f ...

  8. 介绍一种在MATLAB中获取股市数据的方法

    介绍一种在MATLAB中获取股市数据的方法: >>clear >>c=yahoo 系统会返回 c = url: 'http://finance.yahoo.com'       ...

  9. 检测到目标服务器启用了trace方法_综述:目标检测中的多尺度检测方法

    ↑ 点击蓝字 关注极市平台作者丨SFXiang来源丨AI算法修炼营编辑丨极市平台 极市导读 本文从降低下采样率与空洞卷积.多尺度训练.优化Anchor尺寸设计.深层和浅层特征融合等多个方面入手,对目标 ...

最新文章

  1. 如何写新的C++ OP
  2. Centos 7下mysql的安装与配置
  3. Policy-based RL小结(Policy Gradient ; Natural policy gradient ;TRPO;ACKTR;PPO )
  4. kettle 笛卡尔_Kettle用户操作手册1
  5. JAVAAPI之STRING类和STRINGBUFER类
  6. pytest teardown 未执行_python3+pytest+allure框架搭建之pytest详解(一)
  7. CurvLearn开源 | 阿里妈妈曲率学习框架详解
  8. 进程和线程计算机组成原理面试题,2016年云南财经大学信息学院计算机组成原理复试笔试最后押题五套卷...
  9. 有机晶体数据库_Cambridge Structural Database 2017 晶体结构分析软件分享
  10. 动态添加表格点击事件
  11. TensorFlow DCNN
  12. C语言的本质(2)——二进制、八进制、十六进制与十进制
  13. Python机器学习库sklearn自动特征选择(训练集)
  14. 试议软件开发与硬件开发的异同。
  15. 文件传输工具WinSCP下载安装教程
  16. 充电书库-study
  17. UVA11105 H-半素数 Semi-prime H-numbers(线性筛+前缀和+暴力)
  18. Android 虚拟机访问本地服务器
  19. 神经网络 语音识别,神经网络语音合成
  20. Unity3D编辑器扩展--自定义创建圆锥体

热门文章

  1. [VB.NET]设置TextBox的提示文字
  2. 纯文科生学计算机编程难度大不大
  3. 牧师与魔鬼——动作分离版
  4. U盘安装OS X Yosemite 10.10.5系统
  5. GIS地图坐标系转换方法,快快收藏
  6. 16岁女孩攻陷著名安全企业HBGary
  7. 什么是克鲁斯卡尔算法?
  8. 【数据结构】之两栈共享空间(C语言)
  9. 基于ESP8266与Blinker(点灯科技平台)的智能遥控器设计
  10. 赞美CSDN 我去年买了个登山包超耐磨。