基于OpenCV 的视频人脸检测

2019-10-15 06:55沈娟安庆职业技术学院徐英君安庆市公安局
数码世界 2019年10期
关键词:级联检测器算子

沈娟 安庆职业技术学院 徐英君 安庆市公安局

随着互联网的普及,以及移动网络网的大踏步发展,互联网渗透到人们生活的每一个角落。人脸识别也得到了更广泛的应用如人脸解锁、人脸付款、人脸追踪等。人脸识别的第一步通常是筛选和定位出图片或视频中的人脸,也就是人脸检测。人脸检测是指对于任意一幅给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸,如果是则返回人脸的位置、大小和姿态。

OpenCV(Open Source Computer Vision Library)由 Intel公司开发,是开源的视觉算法库,由C 和 C++ 函数组成。本文借助OpenCV 的人脸检测程序采用了统计模型方法中的的Viola & Jones人脸检测方法,与Adaboost 算法相结合,Adaboost 算法的循环中,首先利用各种弱分类器对训练图片库进行分类,准确度最高的弱分类器保留下来,同时提高判断错误图片的权重,进入下一个循环最终将每次的循环所保留的弱分类组合起来,成为一个准确的人脸检测器称为强分类器。

1 OpenCV 人脸检测原理

OpenCV 的人脸检测程序采用了统计模型方法中的的Viola &Jones 人脸检测方法,Viola & Jones 人脸检测方法是由Viola 和Jones于2001 年左右提出。

Viola & Jones 人脸检测方法原理

该方法中几个关键性概念:

1.1 Haar-like 特征

Haar-like 型特征是Viola 等人提出的一种简单矩形特征,因为类似Haar 小波而得名。Haar 型特征的定义是黑色矩形和白色矩形在图像子窗口中对应的区域的权重灰度级总和之差。上图显示了两种最简单的特征算子。在上述图中,可以看到,在人脸特定结构处,算子计算得到较大的值。

1.2 积分图

算子数量庞大时上述计算量会太大,Viola 等人发明了积分图方法,使得计算速度大大加快。积分图如上所示,点1 处的值为A 区域的像素积分,点2 处的值为AB 区域的像素积分。对整张图片进行一次积分操作,便可以方便的计算出任一区域D 像素积分值为4+1-2-3.

1.3 Adaboost 训练算法

在离散Adaboot 算法中,Haar-like 特征算子计算结果减去某阈值,便可视为一个人脸检测器。因为准确率不高,称为弱分类器。Adaboost算法的循环中,首先利用各种弱分类器对训练图片库进行分类,准确度最高的弱分类器保留下来,同时提高判断错误图片的权重,进入下一个循环最终将每次的循环所保留的弱分类组合起来,成为一个准确的人脸检测器称为强分类器。

1.4 瀑布型级联检测器

瀑布型级联检测器是针对人脸检测速度问题提出的一种检测结构。瀑布的每一层是一个由Adaboost 算法训练得到的强分类器。设置每层的阈,能够使大多数人脸通过,在此基础上尽可抛弃反例。位置越靠后的层越复杂,具有越强的分类能力。

瀑布型级联检测器结构就像一系列的筛孔大小递减的筛子,每一步都能筛除一些漏下反例,最终通过所有筛子的样本被接受为人脸。

2 开发环境OpenCV

OpenCV是一个基于BSD 许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android 和Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

3 基于OpenCV 的Python 的人脸检测的实现

OpenCV 中对于人脸检测的模型已经建立了一个XML 文件,其中包含了上面面提到的harr 特征的分类器训练结果,我们可以通过加载这个文件而省略掉自己建立级联表过程。有了级联表,我们只需要将待检测图片和和级联表一同传递给OpenCV 的目标检测算法即可得到一个检测到人脸的集合。

3.1 配置软件环境

(1) 下载Python2.73,安装,并配置Python 环境变量:"C:Program FilesPython27;"(这里我们安装在C 盘下,亦可以安装在其他位置)

(2)下载OpenCV2.46,安装,并配置OpenCV 环境变量:"D:Program Filesopencvuildx86vc10in";(这里我们安装在d盘下,亦可以安装在其他位置

(3) 下 载NumPy1.62,安 装,版 本:numpy-1.6.2-win32-superpack-python2.7;(注意:要与Python 版本必须兼容,即文件名需含有“python2.7”)

(4) 把OpenCV 目 录 "D:Program Filesopencvuildpython2.7" 下的文件 "cv2.pyd"

复制 到Python 目录 "c:Program FilesPython27Libsitepackages"下。

3.2 代码实现

步骤一:获取帧及图片预处理

读取视频中一个帧(一张图片),然后对这张图片进行一些预处理:

读取视频中的帧(一张图片)

将图片从RGB 模式转为灰度图

进行灰度图直方图均衡化操作

Python 代码:

步骤二:检测并标记目标

OpenCV 中的XML 文件已包含harr 特征的分类器的训练结果,这里我们直接加载这个文件而不是自建立级联表。接下来我们只需要将待检测的图片和级联表一同传递给OpenCV 的目标检测算法,就可得到一个检测发现到的人脸的集合。

Python 代码:

#detect 函数是参照级联表cascade 对图片imge 进行检测,返回人脸的集合

步骤三:保存含有人脸的帧(图片)到指定的地址

如果帧中(图片)中存在人脸,将此帧保存到指定的文件中。

Python 代码:

效果图1:

经试验测试,本程序可以完成大部分人脸的检测,但在角度、光照、遮挡等因素的影响下,任有部分人脸不能正确检测。

4 结论

本文介绍了如何使用OpenCV 来实现对视频文件进行人脸检测,从而帮助视频侦查时减轻肉眼检测视频的劳动强度。相对于功能强大的OpenCV 及大量的算法实现来说,文中涉及到的内容只是计算机视觉中很小的一部分。读者可以考虑将其应用到更为广泛的领域中,如将其应用到视屏监控的实时检测记录中以及远程监控中,使得其在视频侦查中得到更为广泛的应用。

猜你喜欢
级联检测器算子
铀浓缩厂级联系统核安全分析
有界线性算子及其函数的(R)性质
参数可调的联合子空间目标检测方法 *
基于交通诱导的高速公路交通检测器布设方案研究
Domestication or Foreignization:A Cultural Choice
基于均匀性判定规则的统计MIMO雷达多通道融合检测技术
QK空间上的叠加算子
否定选择算法中高性能检测器的生成
整体级联式增压空气冷却器的进气模块
一种改进的脉冲级联分离中间组分