Python实时人脸检测:附完整代码

需要全部代码请点赞关注收藏后评论区留言私信~~~

本文介绍一个简易的项目,我们将使用OpenCV和Python实现实时人脸检测,我们将研究 OpenCV 中的 Haar 级联分类器(Haar Cascade Classifier)算法, Haar 级联分类器是一种流行的目标检测算法。

 1.Harr分类器

Haar-like特征最早是由Papageorgiou等人用于物体检测的数字图像特征,而Viola和Jones在此基础上,使用3种类型4种形式的特征:

 Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。

    这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。

以Haar特征分类器为基础的对象检测技术是一种非常有效的对象检测技术,但其实并不新颖,不过因为技术成熟好用这里依然采用这一方法。它是基于机器学习的,使用大量的正负样本训练得到分类器。其实就是基于对人脸特征的描述,分类器根据训练的样品数据进行训练,完成后即可感知读取到的图片上的特征,进而对图片进行人脸识别。

OpenCV已在GitHub训练结果网址(https://github.com/opencv/opencv/tree/master/data/haarcascades)上分享了其训练好的结果数据,分类器普适性较好可满足一般人脸检测的需要,调用的代码如下:

import cv2
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')

如果安装好了OpenCV,它的依赖库中OpenCV 提供了关于 Haar 特征和级联分类器的预训练模型,可以在以下位置找到必要的 XML 文件:

/home/<username>/.local/lib/<python-version>/site-packages/cv2/data/

 以上Ubuntu的位置,Windows下的情况同样在Python环境的site-package目录下,下面我们看看如何使用这些预训练的 Haar 级联模型来检测人脸。

2.检测步骤实现

首先,创建一个 python 文件 face_detection.py 并粘贴以下代码:

(1)导入包:


import cv2
import os

(2)初始化haar分类器:


cascPath=os.path.dirname(cv2.__file__)+"/data/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)

(3)对相机的画面帧应用人脸haar检测器:


video_capture = cv2.VideoCapture(0)

while True:
    # Capture frame-by-frame
    ret, frames = video_capture.read()

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

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

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frames, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow('Video', frames)

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

(4)释放画面:


video_capture.release()
cv2.destroyAllWindows()

(5)运行程序:


python3 face_detection.py

在画面中可以看到网络摄像头画面帧中检测出的人脸边界框,要停止网络摄像头获取画面,可按“q”键结束。

Haar级联分类器是一个基础的人脸检测模型,它的检测速度快、精度较高,能够满足常见的人脸检测任务,当然如果想获得高精度的人脸检测可以使用faceNet模型。如何利用检测出的人脸区域进行人脸识别匹配详见CSDN

物联沃分享整理
物联沃-IOTWORD物联网 » Python实时人脸检测:附完整代码

发表评论