人脸识别.docx
《人脸识别.docx》由会员分享,可在线阅读,更多相关《人脸识别.docx(11页珍藏版)》请在冰豆网上搜索。
人脸识别
课程大作业实验方案
人脸的识别
课程名称:
数字图像处理
目录
1大作业要求1
2开发环境1
3系统分析1
3.1系统的主要功能分析1
3.1.1脸部定位1
3.1.2五官定位1
3.2系统的关键问题及解决方法1
3.2.1肤色提取1
3.2.2眼睛、鼻子、嘴巴的定位2
4系统设计8
4.1程序流程图及说明8
4.2程序主要模块(或功能)介绍8
5心得体会……………………….……………………………………8
一、大作业要求
1.对含有人脸的图像,做到提取人脸区域----人脸识别;
2.对识别出来的人脸图像,做到五官定位----主要是找到左右眼睛、鼻子、嘴巴的位置,并用方框圈出来。
3.连接视频头,提取人脸头像,并对人脸五官进行定位(用方框表示)。
二、开发环境
软件:
CVI软件、win7操作系统。
硬件设备:
IntelPentiumM处理器、1.40GHz、2.0G内存。
三、系统分析
3.1系统的主要功能分析
3.1.1脸部的定位模块
脸部的定位的任务是找出脸的位置。
将脸部从图像中提取出来。
3.1.2五官识别模块
从脸部图像中定位五官位置。
3.2.系统的关键问题及解决方法
3.2.1肤色提取
图1实验图像
1.将RGB空间转换为YCbCr空间:
为了把人脸区域从非人脸区域分割出来,需要使用适合不同肤色和不同光照条件的可靠的肤色模型。
常用的RGB表示方法不适合于皮肤模型,在RGB空间,三基色(r、g、b)不仅代表颜色,还表示了亮度。
由于周围环境光照的改变,亮度可能使人脸的检测变得更加复杂,在皮肤的分割过程中是不可靠的。
为利用肤色在色度空间的聚类性,需要把颜色表达式中的色度信息与亮度信息分开,将R、G、B转换为色度与亮度分开的色彩表达空间可以达到这个目的。
颜色空间的转换常用的颜色模型主要有:
YCrCb、HSV、YIQ等。
在本文的实验中选用YCrCb空间作为肤色分布统计的映射空间,该空间的优点是受亮度变化的影响较小,而且是两维独立分布,能较好地限制肤色分布区域。
使用函数为:
YCBCR=rgb2ycbcr(RGB);
2.将彩色图像转换为灰度图像,实验证明,不同的肤色具有相同的2D模型G(m,V^2)。
灰度值对应属于皮肤区域的可能性,同过设定门限,就可以转换为二值图像,1,0分别表示皮肤和非皮肤区域。
皮肤颜色在ycbcr色度空间的分布范围为:
100<=cb<=127,138<=cr<=170,可以将彩色图像转换为二值图像。
3.转换后不可避免出现了噪声,有背景的噪声影响,以及人的衣服和裤子引起的噪声点,使用开闭运算的方法消除噪声。
4.人脸候选区筛选时,由于头部部分重合,以及头部与其他部分,例如衣服等的连接,对筛选造成了困难,故应先利用闭运算操作,断开连接,再进行处理。
5.利用边缘检测,检测出人脸;利用得到的边缘,对原图像进行处理,就可以在原图中画出人脸区域的框图.可以看出,由于人手交叉放置,所以不管从肤色还是形状以及面积比上,都很难将其识别和删除,所以出现了两个错误检测,这也是本程序应改进的地方。
图2肤色提取
3.2.2眼睛、鼻子、嘴巴的定位
解决办法:
采用类似于确定脸宽度提取的方法。
这里我们采用水平灰度投影。
再将图像进行高低灰度分离,设定一个阈值,将灰度值小于阈值点的灰度设成255,大于阈值的点不变,这样做是为了突出脸部特征位置的边缘(如眼睛,鼻子等),然后进行边缘检测,再把边缘检测完的图像进行水平灰度投影,如图2所示。
图3水平灰度投影
同样道理,我们将曲线做平滑后再进行差分处理,如图3所示。
黄色的直线是曲线中所有正值的平均值加上修正值,蓝色的直线是曲线中所有的负值的平均值加上修正值。
我们再做了一个预处理:
将差分后曲线正值减去所有正值的平均值,突出波峰;将差分后曲线负值减去所有负值的平均值,突出波谷。
经过我们的大量实验观察,我们得到以下找特征值的算法:
1.在200到240之间找一个低谷且该低谷到下一个低谷的距离(鼻子)大于上一个低谷(眉毛下边界)到该低谷距离的两倍,为眼睛下边界;
2.向左找最邻近一个波峰,为眼睛上边界;
3.向右找一个低谷,为鼻子水平位置;
4.再向右找一个低谷,为嘴巴水平位置;
5.再向右找一个低谷,为下巴水平位置。
在多次实验中我们发现了有时会出现一些位置误判的情况,所以再根据人脸的一些规律,有上面的方法的基础上对程序进行改进,加入一些判断条件,使其准确性大大地提高了。
定位后图像如图4所示。
图4人脸特征水平定位差分图像
图5脸部特征参数定位
3.2.3脸部特征参数的提取
解决办法:
根据上一步的定位,将眼睛,鼻子,嘴巴的图像单独提取出来。
然后利用垂直灰度投影曲线,分别将眼睛,鼻子,嘴巴的特征参数提取出来。
下面演示眼睛参数的提取,其他参数的提取类似于眼睛参数的提取。
图6提取眼睛图像
得到独立的眼睛的图像后,经过分离高低灰度和边缘检测,再对其进行垂直灰度投影,得到如下的直方图。
图7眼睛垂直灰度投影
差分后曲线:
图8眼睛差分后曲线
同样将曲线进行预处理,突出波峰波谷,经过实验观察,我们又总结了如下规律:
1.从脸宽中间向左找一个波谷,为左眼右边缘;
2.从脸宽中间向右找一个波峰,为右眼左边缘;
3.从左眼右边缘向左找一个邻近波峰,如果眼部宽度大于1/6脸宽,则判断为左眼左边缘,否则继续向左找波峰,再判断;
4.从右眼左边缘向右找一个邻近谷峰,如果眼部宽度大于1/6脸宽,则判断为右眼右边缘,否则继续向右找波谷,再判断;
根据这个规律,只要分离灰度和边缘检测处理比较好,基本上能准确定位眼睛的位置。
定位鼻子和嘴唇的原理与定位眼睛类似,只是在对差分后图像的波峰波谷寻找算法上略有不同。
定位结果如图7所示。
图9脸部特征参数的精确定位
为了建立数据库,我们将其特征值提取并计算出来,显示在面板上,如图8所示。
图10脸部特征参数的提取
四、系统设计
a)程序流程图及说明
上面列出的流程图只是主要的部分,一些在程序中出现的由于太过具体就没画出来。
各部分的功能也在上面已经详细介绍。
在此不重复。
b)程序主要模块(或功能)介绍
各模块的实现方法及主要思想已经在上面的“系统的关键问题及解决方法”中介绍,由于程序也比较长,在此不列出。
为了满足我们的处理要求,我们自定义了几个函数,并封装成两个头文件,分别为“find.h”与“curve_process.h”,分别是进行寻找计算和数据曲线处理。
其详细程序请看两个头文件。
五、心得体会
在没做大作业之前对这门课程还是没有什么深刻的体会,在课堂上的讲的东西虽然有用,但是要是不能将在课堂上的学的东西结合到实践中,那终归是纸上谈兵。
而这次的大作业就给了我们一个自己动手的机会,将理论与实践完美的结合起来,让我们对以前学的理论知识有了更深刻的体会。
在做大作业之前,由于有了老师布置的5个实验,使得我们对CVI这个软件有了初步的理解,对我们在做大作业时起到了很大的帮助。
其实在做大作业时,很多函数都是在我们做实验的时候遇到过,由于有了前面实验的铺垫,做起来也比较顺手。
但是大作业还是不同于实验,大作业设计的面比较广,这就要求我们得学会将实验接触过的一些函数融会贯通,此外,在参考了一些论文之后,还涉及到未知函数的使用。
所以,对我们来说,大作业的难点就是要将以前实验学过的函数融会贯通,此外还得具有自学新函数的能力。
由于新函数的说明都是英文,这对于我们工科的学生还是挺棘手的,使得我们对新函数的理解不够彻底,这样就直接导致了新函数不能正确使用,结果就是我们拿着词典一个一个的查单词,一次又一次的改进新函数,直到成功为止。
在做大作业时,我们就用到了很多新的函数。
导致我们走了很多弯路!
不过,这样我们就对新函数的认识很熟悉了!
由于要针对我们的方法,所以也自编了很多函数,虽然适应性不是很广,但是对整个工程的成功实现起了很大的作用,经过这次的锻炼,我们的C语言编程能力也有了很大的提高。
总的来说,我们选的题目是人脸识别,这个项目的难度还挺大的,中间遇到了很多问题,但是都被我们一一迎刃而解了,总之,我们是痛并快乐着!
对本门课的意见:
上课时可以加多点cvi实验的讲解;大作业可以设一个中期考核。
六、参考文献
[1]彩色图像中主要人脸特征位置的全自动标定
[2]彩色图像中的正面人脸检测的研究
[3]人脸识别技术的比较与结合
[4]人脸识别技术的研究
[5]人脸识别技术综述
[6]人脸图像定位与标准化算法
[7]一种基于肤色和几何特征的人面部识别方法
[8]一种基于颜色信息的人脸检测方法