Python 计算机视觉(十六)—— 图像和视频中的人脸识别

参考的一些文章以及论文我都会给大家分享出来 —— 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了。大家一起学习,一起进步!加油!!

本篇博文主要参考自:OpenCV 官网 

目录

一 准备工作

1 基本思路

2 准备工作

二 图像中的人脸识别

三 视频中的人脸识别

1 视频文件中的人脸识别

2 摄像头下的人脸识别

四 结束语


一 准备工作

1 基本思路

        一般来说人脸识别是使用分类器完成的,而这种分类器则需要使用专门的机器学习或者深度学习的分类器训练方法进行训练得到,比如通过输入大量的正图像(需要分类的目标图像)和负图像(不是训练目标的事物图像)来得到分类目标的各种特征,训练完成的分类器就可以对之后输入的图像进行识别和判断了。在本篇博文中我们肯定不会自己去训练一个分类器,而是投机取巧拿到OpenCV 提供的现成的人脸识别分类器进行识别。

2 准备工作

首先我们需要得到官网提供的分类器,也就是已经封装好的几个 xml 文件,如下:

这些分类器的下载方式有很多种,也有一些博主已经讲的很清楚了,在这里就不详细说明了,如果需要的话可以参考下面这位博主提供的资源,在他提供的网盘资源中下载速度也是非常快的:

opencv中haar级联分类器的所有XML下载

二 图像中的人脸识别

       分类器下载好后进行导入,方式和图像的读取一样,只要在 CascadeClassifier() 函数中输入分类器 xml 文件的保存路径就可以了。由于眼睛肯定会在脸上,所以在对眼睛进行识别检测时在脸部识别后进行,可以减少计算量。代码如下,已经添加了注释,有解释不清楚的地方可以去官网参考或者在评论区进行讨论:

"""
Author:XiaoMa
date:2021/11/23
"""
import cv2 as cv

face_cascade = cv.CascadeClassifier('E:\Python\opencvclassifier\data\haarcascades\haarcascade_frontalface_default.xml')  #导入识别脸部的分类器
eye_cascade = cv.CascadeClassifier('E:\Python\opencvclassifier\data\haarcascades\haarcascade_eye.xml')                   #导入识别眼睛的分类器

img = cv.imread('E:\From Zhihu\For the desk\\cvsixteen1.jpg')     #读取图像
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)                        #将图像转化为灰度图

faces = face_cascade.detectMultiScale(gray, 1.1, 5)               #对脸部分类器的大小以及绘制的框图数目进行限定
for (x, y, w, h) in faces:
    cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)     #对脸部进行矩形框绘制
    roi_gray = gray[y:y+h, x:x+w]                                 #建立这个数据的目的是进行眼睛的识别时减小计算量
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)                 #对眼睛分类器进行限定
    for (ex, ey, ew, eh) in eyes:
        cv.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 0, 255), 2) #对眼睛进行框取
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

得到的结果如下:

 

可以看出,官网提供的分类器效果还是可以的,但如果我们换一下图像:

 

       可以看出训练好的分类器也并不是完全可靠的,这就可能和训练分类器时使用的训练样本数目以及样本的多样性有关,机器学习中的一些过拟合、欠拟合等知识点以后慢慢解释。

三 视频中的人脸识别

1 视频文件中的人脸识别

"""
Author:XiaoMa
date:2021/11/23
"""

import cv2 as cv

face_cascade = cv.CascadeClassifier('E:\Python\opencvclassifier\data\haarcascades\haarcascade_frontalface_default.xml')  #导入识别脸部的分类器
eye_cascade = cv.CascadeClassifier('E:\Python\opencvclassifier\data\haarcascades\haarcascade_eye.xml')                   #导入识别眼睛的分类器

capture = cv.VideoCapture('E:\From Zhihu\For the desk\\facedetection.avi')  #通过 videoCapture() 函数可以进行视频信息的导入
while(True):
    # 获取一帧
    ret, frame = capture.read()  #读取成功后 ret 返回为为布尔值True,frame返回读取的一帧图像 
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)   #前面图像识别中注释过了
    #大致已经注释过了
    for (x, y, w, h) in faces:
        cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
    frame = cv.resize(frame, dsize = None, fx = 0.3, fy = 0.3)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('b'):         #按下‘b’键退出窗口
        break

得到的效果如下(由于未制作gif格式的图像,所以简单截个图给大家展示一下效果):

2 摄像头下的人脸识别

主要是对 VideoCapture() 函数的修改,其他的都没什么大变化,可以参考前面的

"""
Author:XiaoMa
date:2021/11/23
"""

import cv2 as cv

face_cascade = cv.CascadeClassifier('E:\Python\opencvclassifier\data\haarcascades\haarcascade_frontalface_default.xml')  #导入识别脸部的分类器
eye_cascade = cv.CascadeClassifier('E:\Python\opencvclassifier\data\haarcascades\haarcascade_eye.xml')                   #导入识别眼睛的分类器
capture = cv.VideoCapture(0)  #当该函数参数设置为0时默认打开电脑设备摄像头
while(True):
    ret, frame = capture.read()
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('b'):
        break

效果还算可以吧:

四 结束语

       本篇博文主要参考了 OpenCV 官网,使用提供的现成的分类器进行图像、视频以及摄像头下的人脸识别,大家也可以去官网进行详细的学习,至于训练分类器以后咱们山高路远,以后慢慢更新,加油!

おすすめ

転載: blog.csdn.net/qq_52309640/article/details/120941440