实验环境:python 3.6 + opencv-python 3.4.14.51 建议使用 anaconda 配置相
同环境
背景
人脸识别步骤
人脸采集
采集人脸图片的方法多种多样,可以直接从网上下载数据集,可以从视频中提
取图片,还可以从摄像头实时的采集图片。
人脸检测方法
人脸检测在实际中主要用于人脸识别的预处理,即在图像中准确标定出人脸的
位置和大小。人脸图像中包含的模式特征十分丰富,如直方图特征、颜色特
征、模板特征、结构特征及 Haar 特征等。人脸检测就是把这其中有用的信息挑
出来,并利用这些特征实现人脸检测。
人脸图像预处理
对于人脸的图像预处理是基于人脸检测结果,对图像进行处理并最终服务于特
征提取的过程。系统获取的原始图像由于受到各种条件的限制和随机 干扰,往
往不能直接使用,必须在图像处理的早期阶段对它进行灰度校正、噪声过滤等
图像预处理。对于人脸图像而言,其预处理过程主要包括人脸图像的光线补
偿、灰度变换、直方图均衡化、归一化、几何校正、滤波以及锐化等。
人脸特征提取
人脸识别系统可使用的特征通常分为视觉特征、像素统计特征、人脸图像变换
系数特征、人脸图像代数 特征等。人脸特征提取就是针对人脸的某些特征进行
的。人脸特征提取,也称人脸表征,它是对人脸进行特征建模的过程。人脸特
征提取的方法归纳起来分为两大 类:一种是基于知识的表征方法;另外一种是
基于代数特征或统计学习的表征方法。
匹配与识别
提取的人脸图像的特征数据与数据库中存储的特征模板进行搜索匹配,通过设
定一个阈值,当相似度超过这一阈值,则把匹配得到的结果输 出。人脸识别就
是将待识别的人脸特征与已得到的人脸特征模板进行比较,根据相似程度对人
脸的身份信息进行判断。这一过程又分为两类:一类是确认,是一对一 进行图
像比较的过程,另一类是辨认,是一对多进行图像匹配对比的过程。
关于 OpenCv
Opencv 是一个开源的的跨平台计算机视觉库,内部实现了图像处理和计算机
视觉方面的很多通用算法,对于 python 而言,在引用 opencv 库的时候需要写
为 import cv2。其中,cv2 是 opencv 的 C++命名空间名称,使用它来表示调
用的是 C++开发的 opencv 的接口
目前人脸识别有很多较为成熟的方法,这里调用 OpenCv 库,而 OpenCV 又提
供了三种人脸识别方法,分别是 LBPH 方法、EigenFishfaces 方法、Fisherfaces
方法。本文采用的是 LBPH(Local Binary Patterns Histogram,局部二值模式直
方图)方法。在 OpenCV 中,可以用函数
cv2.face.LBPHFaceRecognizer_create()生成 LBPH 识别器实例模型,然后应用
cv2.face_FaceRecognizer.train()函数完成训练,最后用
cv2.face_FaceRecognizer.predict()函数完成人脸识别。
CascadeClassifier,是 Opencv 中做人脸检测的时候的一个级联分类器。并且既
可以使用 Haar,也可以使用 LBP 特征。其中 Haar 特征是一种反映图像的灰度
变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、
中心特征和对角线特征。
程序设计
人脸识别算法:
1.准备工作
首先读取 config 文件,文件中第一行代表当前已经储存的人名个数,接下来每
一行是二元组(id,name)即标签和对应的人名 读取结果存到以下两个全局
变量中。
id_dict = {} # 字典里存的是 id——name 键值对
Total_face_num = 999 # 已经被识别有用户名的人脸个数,
def init(): # 将 config 文件内的信息读入到字典中
加载人脸检测分类器 Haar,并准备好识别方法 LBPH 方法
# 加载 OpenCV 人脸检测分类器 Haar
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 准备好识别方法 LBPH 方法
recognizer = cv2.face.LBPHFaceRecognizer_create()
然后打开标号为 0 的摄像头
camera = cv2.VideoCapture(0) # 摄像头
success, img = camera.read() # 从摄像头读取照片