人脸检测和识别
人脸检测是指在图像中完成人脸定位的过程。人脸识别是在人脸检测的基础上进一步判断人的身份。
1、基于Haar的人脸检测
OpenCV中提供了多个训练好的分类器,其中Haar级联分类器用来进行人脸检测。
分类器文件在OpenCV源代码的“..\Python3.8\Lib\site-packages\cv2\data”文件夹中。
该文件夹中有以下常用的分类器文件:
haarcascade_eye.xml 人眼检测
haarcascade_eye_tree_eyeglasses.xml 眼镜检测
haarcascade_frontalcatface.xml 猫脸检测
haarcascade_frontalface_alt.xml 人脸检测
haarcascade_frontalface_default.xml 人脸检测
haarcascade_profileface.xml 侧脸检测
cv2.CascadeClassifier()函数用于加载分类器,其基本格式如下。
faceClassifier = cv2.CascadeClassifier(filename)
参数说明:
filename: 为级联分类器的文件名。
faceClassifier: 为返回的级联分类器对象。
级联分类器对象的detectMultiScale()方法用于执行检测,其基本格式如下。
objects = faceClassifier.detectMultiScale(image)
参数说明:
objects: 为返回的目标矩形集,矩形中为人脸。
image: 为输入图像,通常为灰度图像。
案例1:识别单人人脸
import cv2
# 读取图像
img = cv2.imread("img/dr.png")
# 将RGB图像转为灰度图,其目的是方便人脸识别
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建分类器,并加载人脸检测文件
face = cv2.CascadeClassifier("haar/haarcascade_frontalface_default.xml")
# 执行人脸检测,gray为被检测对象,返回检测到的人脸集数据
faces = face.detectMultiScale(image=gray)
# 单人检测。获取一个人脸的数据,其中xy为左上顶点坐标,w为人脸宽度,h为人脸高度
x, y, w, h = faces[0]
# 在原图中画出人脸位置。(x, y)为左上顶点,(x+w, y+h)为右下项点,1为线宽
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1)
cv2.imshow("test", img)
cv2.waitKey(0)
运行结果:
案例2:识别多人人脸
import cv2
# 读取图像
img = cv2.imread("img/drz.jpg")
# 将RGB图像转为灰度图,其目的是方便人脸识别
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建分类器,并加载人脸检测文件
face = cv2.CascadeClassifier("haar/haarcascade_frontalface_default.xml")
# 执行人脸检测,gray为被检测对象,返回检测到的人脸集数据
faces = face.detectMultiScale(image=gray)
# 识别多人人脸
for f in faces:
x, y, w, h = f
# 根据识别的特征,反复往img图像中标注人脸
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1)
cv2.imshow("test", img)
cv2.waitKey(0)
运行结果:
案例3:猫脸识别
使用haarcascade_frontalcatface.xml分类器文件,可以检测图像中的猫脸。
import cv2
# 读取图像
img = cv2.imread("img/cat.jpg")
# 将RGB图像转为灰度图,其目的是方便图像识别
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建分类器,并加载猫脸检测文件
face = cv2.CascadeClassifier("haar/haarcascade_frontalcatface.xml")
# 执行猫脸检测,gray为被检测对象,返回检测到的猫脸集数据
faces = face.detectMultiScale(image=gray)
# 识别多个猫脸
for f in faces:
x, y, w, h = f
# 根据识别的特征,反复往img图像中标注猫脸
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1)
cv2.imshow("test", img)
cv2.waitKey(0)
运行结果:
案例4:检测摄像头中的人脸
import cv2
# 打开摄像头
video = cv2.VideoCapture(0)
# 加载人脸分类器
face = cv2.CascadeClassifier("haar/haarcascade_frontalface_default.xml")
while video.isOpened():
# 读取每一帧图像
b, frame = video.read()
if b:
# 将图像转为灰度图
gary = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测每一帧图像中的人脸
faces = face.detectMultiScale(gary)
# 标注检查出的人脸
for f in faces:
x, y, w, h = f
cv2.rectangle(frame, (x, y), (x+w, y+h), (246, 0, 220), 2)
cv2.imshow("test", frame)
key = cv2.waitKey(30)
if key == 27:
break
else:
break
# 释放资源
video.release()
cv2.destroyAllWindows()