徐高翔的个人网站

OpenCV中的人脸检测

2018-11-04

软硬件环境

  • ubuntu 18.04 64bit
  • anaconda3 with python 3.6.4
  • opencv 3.4.2

Haar cascade分级器

haar,哈尔特征,是用于物体识别的一种数字图像特征,是最早用于即时人脸检测的算法。哈尔特征使用检测窗口中指定位置的相邻矩形,计算每一个矩形的像素和并取其差值,然后用这些差值来对图像的子区域进行分类。

使用基于haar特征的分级器来进行物体检测是一种非常有效的方法,它是由Paul ViolaMichael Jones在2001的论文Rapid Object Detection using a Boosted Cascade of Simple Features中提出。

在人脸的检测中,我们需要一个基于haar cascade的分级器,它是由正样本(带脸的图片)和负样本(没脸的图片)训练而成。OpenCV发行版中自带了已经训练好的分级器haarcascade_frontalface_default.xml,我们可以直接拿来使用。除了人脸,其它物体的检测opencv也提供了默认的分级器,可以到安装目录中查看,~/anaconda3/pkgs/opencv3-3.1.0-py36_0/share/OpenCV/haarcascades

代码实例

以检测摄像头中人脸为例,图片、视频文件都一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import cv2
import sys

cascPath = sys.argv[1]
# 读取分级器文件
faceCascade = cv2.CascadeClassifier(cascPath)

# 打开摄像头
video_capture = cv2.VideoCapture(0)

while True:
# 读取数据帧
ret, frame = video_capture.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE
)

# 框出脸的位置
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示
cv2.imshow('Video', frame)

if cv2.waitKey(1) & 0xFF == ord('q'):
break

# 释放资源
video_capture.release()
cv2.destroyAllWindows()

运行上面的脚本

1
python test.py haarcascade_frontalface_default.xml

cv_haar_face

训练自己的分级器

查看官方的文档,https://docs.opencv.org/3.4/dc/d88/tutorial_traincascade.html,非常详尽。

参考资料

本文链接 https://xugaoxiang.com/2018/11/04/OpenCV中的人脸检测/

推荐文章(由hexo文章推荐插件驱动)

使用支付宝打赏
使用微信打赏

请博主喝咖啡!