使用 OpenCV 检测人脸

在做表情识别的时候,突然在《机器学习——算法原理与编程实践》一书中看到了人脸检测的部分。书中使用的是 OpenCV 自带的 Haar 特征级联表作为训练集,标记人脸的。这种方法我之前也在网上看到过,因为没有成功(现在看来应该是使用了错误的表造成的)所以使用了 face_recognition 的库来进行的。

现在既然成功完成了这种方法,那自然也要用起来。


前期配置

这一次的表情识别的前期工作都是用 Python2.7 做的,因此代码也是基于 Python2.7 的。Python3 的话,应该也是大同小异的。

建议使用 anaconda 配置 Python 虚拟环境,使用起来也很方便。

需要使用的特征级联表,书上使用 haarcascade_frontalface_alt_tree.xml 和 lbpcascade_frontalface.xml,我将使用后者。

上述两个文件分别在链接位置 haarcascades 和 lbpcascades 目录下。


使用方法

关键代码

1
2
3
4
5
6
7
8
9
face_cascade = cv2.CascadeClassifier('./lbpcascade_frontalface.xml')
# 参数说明:
# gray:传入的图片,一般使用灰度图
# 1.2: scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1:即每次搜索窗口依次扩大10%
# 3: minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
# 如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
# 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
# 这种设定值一般用在用户自定义对检测结果的组合程序上
faces = face_cascade.detectMultiScale(gray, 1.2, 3)

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: utf-8 -*-

from numpy import *
import cv2

face_cascade = cv2.CascadeClassifier('./lbpcascade_frontalface.xml')

img = cv2.imread('./test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.2, 3)

for (x, y, w, h) in faces:
img2 = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)
cv2.imwrite('./sample.jpg',img2)
# 下面是面部区域的灰度图和原图,可以使用 imwrite 保存为文件
roi_gray = gray[y: y + h, x: x + w]
roi_color = img[y: y + h, x: x + w]

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图

sample


P.S. 在使用 dlib 做面部特征点标记的时候,发现 dlib 也有 face_detector,有时间我会在下一篇文章中介绍一下。

0%