欢迎来到军工软件开发人才培养基地——学到牛牛

人脸检测和识别

时间:2024-05-06 07:01:10 来源:学到牛牛

人脸检测是指在图像中完成人脸定位的过程。人脸识别是在人脸检测的基础上进一步判断人的身份。

 

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()