在静态图像或视频中检测人脸的操作十分相似。视频人脸检测只是从摄像头读出每帧图像,然后采用静态图像中人脸检测方法进行检测。视频中人脸检测还涉及到其他概念,例如跟踪,而静态图像中的人脸识别就没有这样的概念,但它们的基本理论一致。
静态图像的人脸检测
人脸检测首先是加载图像并检测人脸,这也是最基本的一步。为了使所得到的结果有意义,可在原始图像的人脸周围绘制矩阵框。
其中项目中cascades/haarcascades文件夹包含了所有OpenCV的人脸识别的XML文件,用于检测静止文件、视频、摄像头所得到图像中的人脸。
树状图
.
├── image_detection.py
├── video_detection.py
├── images
│ └──people.jpg
└──cascades
├── haarcascade_frontalface_default.xml
└── haarcascade_eye.xml
代码
# -*- coding: utf-8 -*-
"""
Created on Fri Jan 1 21:07:47 2021
@author: gkm0120
"""
# image_detection.py
import cv2
filename = 'D:/Python/Test_code/pycv/images/people.jpg'
def detect(filename):
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# face_cascade.detectMultiScale(image,scaleFactor,minNeighbor)
# 参数2是人脸检测过程中每次迭代图像的压缩率,参数3是每个人脸矩形保留近邻数目的最小值
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
# cv2.rectangle允许通过坐标来绘制矩形(x和y表示左上角的坐标,w和h表示人脸矩形的宽度和高度)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 创建namedWindow的实例,并显示处理后的图像
cv2.namedWindow('Face Detection!!')
cv2.imshow('Face Detection!!', img)
cv2.imwrite('./face_detection.jpg', img)
cv2.waitKey(0)
detect(filename)
图例
|
|
视频中的人脸检测
在视频的帧上重复静态人脸检测的过程就能完成视频(如摄像头的输入或视频文件)中的人脸检测。
以下代码主要是:打开摄像头,读取帧,检测帧中的人脸,扫描检测到的人脸的眼睛,对人脸绘制蓝色的矩形框,对眼睛绘制绿色的矩形框。
代码
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 2 10:59:15 2021
@author: gkm0120
"""
# video_detection.py
import cv2
def detect():
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
camera = cv2.VideoCapture(0)# 初始化摄像头,0表示使用第一个摄像头
# 捕获帧,转换为灰度图像。read()函数返回两个值:布尔值(表示是否成功读取帧)、帧本身。
while (True):
ret, frame = camera.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
#img = cv2.imread(frame)
for (x,y,w,h) in faces:
img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
# 限制对眼睛搜索的最小尺寸为40*40像素,可去掉所有假阳性。然后调试参数(特征的最大尺寸、比例因子、近邻的数量),达到预期。
eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40,40))
# 循环输出检测眼睛的结果,并绘制绿色的矩形框
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(img,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(0,255,0),2)
cv2.imshow("camera", frame)
if cv2.waitKey(1000 // 12) & 0xff == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
detect()
图例
注:在眼睛检测中还有另外几个参数。detectMultiscale()函数有许多可选参数:在人脸检测中。默认选项足以检测人脸。但是眼睛是一个比较小的人脸特征,并且胡子或鼻子的本身阴影(self-casting shadow)以及帧的随机阴影都会产生假阳性(false positive)。