您的位置:首页 > 编程语言

人脸识别程序代码研究

2017-01-06 15:35 239 查看
昨天对人脸识别程序代码进行了研究,搞清楚了一部分代码的使用方法、原理等,也对代码各部分作用有了一个基本的认识。今天上午也接着昨天的工作,在继续查阅其他部分相关的相关资料。在孔老师的建议下,为理清人脸识别程序脉络,我们还建立了程序的流程图,以供参考及后续学习。
一、流程

关于对图片的人脸识别程序,其主要流程是:

①头五行对包含的命令进行声明,如opencv的hpp库、标准的输入输出、命名空间等。

②创建、加载分类器对象。此处我们使用的是opencv训练好的分类器。

③创建容器来保存检测对象。通俗地说就是画个框框出来圈住脸

④引用Mat构造函数对图像进行处理。如转换成灰度图(分类器只能读灰度图中的Harr特征)、直方图均衡

⑤运用分类器里的detectMultiScale()函数进行人脸检测

⑥用rectangle函数画出脸部矩形

“说人话”:这个程序就是让计算机看懂一张图片,看出一个范围,圈出这个范围,显示结果。

它怎么看得懂呢?用Mat函数进行图像处理。它怎么看得出这个范围呢?用级联分类器计算。

它怎么圈出来呢?用rectangle函数画出脸部矩形。

而关于对摄像头的视频中的人脸识别,流程几乎是一样的,只是多了一个对人眼的识别算法,已经从视频流中提取帧,进行跟图片差不多的处理。
二、知识点

接着昨天的研究工作,又对一部分程序中用到的重要代码相关的知识进行了学习,例如更多的Mat函数。

1、cvtColor(...),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。参数CV_RGB2GRAY是RGB到gray。参数 CV_GRAY2RGB是gray到RGB。

通常我们很难观察一副非常亮或者非常暗的图像的细节处理,因此对于差异较大的图像,我们可以尝试改变其图像灰度分布来使图像灰度阶分布尽量均匀,进而增强图像细节信息,直方图均衡是通过拉伸各个像素分布来实现图像增强的,以累计分布分布函数变换为基础,通过了特定映射来扩展像素的取值动态范围。均衡化的思想是把一个给定的直方图按照特定的映射转换成一种更宽的更统一的分布,其核心是把集中灰度分布映射成灰度均匀分布。

2、detectMultiScale()函数

该函数在输入图像的不同尺度中检测物体,包括了几个参数:

 (1.image表示的是要检测的输入图像

 (2.objects表示检测到的人脸目标序列

 (3.scaleFactor表示每次图像尺寸减小的比例

 (4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)

 (5.minSize为目标的最小尺寸

 (6.minSize为目标的最大尺寸

3、直方图处理

图像直方图反映了图像像素点的概率分布情况,应用与空间域处理、特征描述及特征匹配等。

可想而知的是一副图像的细节信息通常是非常巨大的,所以我们通过改变其图像灰度分布来使图像灰度阶分布均匀,从而增强图像细节信息。直方图均衡是通过拉伸各个像素分布来实现图像增强的,其算法步骤如下

①获取输入图像直方图②求累计分布直方图,构建查找表③通过图像映射,计算新的图像像素分布。
三、一些尝试

在阅读了相关资料后,对OpenCV的视频操作功能做了一些尝试。总结如下:

(1)读入视频的两种方法

 先实例化再初始化

   VideoCapture capture;

   capture.open("1.avi");//或  capture.open(0);即为调用、读取摄像头

 同时进行

 {  VideoCapture capture("1.avi");//+(2)+ return 0; 再}

(2)运用Mat变量

 while(1) //循环显示每一帧

 {Mat frame; //定义变量。或edges

  capture>>frame; //读取当前帧(P.S.可从此处后面插入边缘检测)

  imshow("读取视频",frame);}//显示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: