参考的一些文章以及论文我都会给大家分享出来 —— 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了。大家一起学习,一起进步!加油!!
目录
一 准备工作
1 基本思路
2 准备工作
二 图像中的人脸识别
三 视频中的人脸识别
1 视频文件中的人脸识别
2 摄像头下的人脸识别
四 结束语
一 准备工作
1 基本思路
分类器完成的,而这种分类器则需要使用专门的机器学习或者深度学习的分类器训练方法进行训练得到,比如通过输入大量的正图像(需要分类的目标图像)和负图像(不是训练目标的事物图像)来得到分类目标的各种特征,训练完成的分类器就可以对之后输入的图像进行识别和判断了。在本篇博文中我们肯定不会自己去训练一个分类器,而是投机取巧拿到OpenCV 提供的现成的人脸识别分类器进行识别。
2 准备工作
首先我们需要得到官网提供的分类器,也就是已经封装好的几个 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
效果还算可以吧:
但我们可以发现一个问题,那就是摄像头下的图像是经过镜像对称的,所以可以尝试对其进行镜像对称变换,具体可以参考我之前的文章:Python 计算机视觉(五)—— OpenCV 进行图像几何变换
直接上代码:
"""
Author:XiaoMa
date:2021/11/23
"""
import cv2 as cv
import copy
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()
frame1 = copy.deepcopy(frame) #对原图像进行复制
h, w = frame.shape[:2]
print(h, w)
for i in range(h): #水平镜像对称
for j in range(w):
frame1[i, w - j - 1] = frame[i, j]
gray = cv.cvtColor(frame1, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv.rectangle(frame1, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame1[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', frame1)
if cv.waitKey(1) == ord('b'):
break
确实是对称变化了的。
四 结束语
本篇博文主要参考了 OpenCV 官网,使用提供的现成的分类器进行图像、视频以及摄像头下的人脸识别,大家也可以去官网进行详细的学习,至于训练分类器以后咱们山高路远,以后慢慢更新,加油!