将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别。
识别图像中的人脸
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#coding:utf-8
import cv2 as cv
# 读取原始图像
img = cv.imread( 'face.png' )
# 调用熟悉的人脸分类器 识别特征类型
# 人脸 - haarcascade_frontalface_default.xml
# 人眼 - haarcascade_eye.xml
# 微笑 - haarcascade_smile.xml
face_detect = cv.CascadeClassifier( 'haarcascade_frontalface_default.xml' )
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 检查人脸 按照1.1倍放到 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.1 , minNeighbors = 5 )
print ( '识别人脸的信息:' ,face_zone)
# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
# 绘制矩形人脸区域 thickness表示线的粗细
cv.rectangle(img, pt1 = (x, y), pt2 = (x + w, y + h),color = [ 0 , 0 , 255 ], thickness = 2 )
# 绘制圆形人脸区域 radius表示半径
cv.circle(img, center = (x + w / / 2 , y + h / / 2 ), radius = w / / 2 , color = [ 0 , 255 , 0 ], thickness = 2 )
# 设置图片可以手动调节大小
cv.namedWindow( "Easmount-CSDN" , 0 )
# 显示图片
cv.imshow( "Easmount-CSDN" , img)
# 等待显示 设置任意键退出程序
cv.waitKey( 0 )
cv.destroyAllWindows()
|
注意,此算法只能检测正脸,并且任何算法都有一定的准确率。如上图所示,图像中有一处被错误地检测为人脸。
CascadeClassifier:
是OpenCV中人脸检测的一个级联分类器,既可以使用Haar,也可以使用LBP特征。以Haar特征分类器为基础的对象检测技术是一种非常有效的技术。它是基于机器学习且使用大量的正负样本训练得到分类器。
Haar-like矩形特征:
是用于物体检测的数字图像特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。
LBP:
是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型。比如:cv.face.LBPHFaceRecognizer_create()。
detectMultiScale:
检测人脸算法,其参数:
– image表示要检测的输入图像
– objects表示检测到的人脸目标序列
– scaleFactor表示每次图像尺寸减小的比例
– minNeighbors表示每一个目标至少要被检测到3次才算是真的目标,因为周围的像素和不同的窗口大小都可以检测到人脸
– minSize表示目标的最小尺寸
– maxSize表示目标的最大尺寸
识别视频中的人脸
将视频中每一帧图像取出,进行图像人脸识别,标记识别到的人脸,显示每一帧图像。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#coding:utf-8
import cv2 as cv
import numpy as np
# 加载视频
cap = cv.VideoCapture( 'wang.mp4' )
# 调用熟悉的人脸分类器 识别特征类型
# 人脸 - haarcascade_frontalface_default.xml
# 人眼 - haarcascade_eye.xm
# 微笑 - haarcascade_smile.xml
face_detect = cv.CascadeClassifier( 'haarcascade_frontalface_default.xml' )
while True :
# 读取视频片段
flag, frame = cap.read()
if flag = = False :
break
# 灰度处理
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 检查人脸 按照1.1倍放到 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.5 , minNeighbors = 8 )
# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
cv.rectangle(frame, pt1 = (x, y), pt2 = (x + w, y + h), color = [ 0 , 0 , 255 ], thickness = 2 )
cv.circle(frame, center = (x + w / / 2 , y + h / / 2 ), radius = w / / 2 , color = [ 0 , 255 , 0 ], thickness = 2 )
# 显示图片
cv.imshow( 'video' , frame)
# 设置退出键和展示频率
if ord ( 'q' ) = = cv.waitKey( 25 ):
break
# 释放资源
cv.destroyAllWindows()
cap.release()
|
识别摄像头中的人脸
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#coding:utf-8
import cv2 as cv
# 识别电脑摄像头并打开
cap = cv.VideoCapture( 0 )
# 调用熟悉的人脸分类器 识别特征类型
# 人脸 - haarcascade_frontalface_default.xml
# 人眼 - haarcascade_eye.xm
# 微笑 - haarcascade_smile.xml
face_detect = cv.CascadeClassifier( 'haarcascade_frontalface_default.xml' )
while True :
# 读取视频片段
flag, frame = cap.read()
if flag = = False :
break
# 灰度处理
gray = cv.cvtColor(frame, code = cv.COLOR_BGR2GRAY)
# 检查人脸 按照1.1倍放到 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.1 , minNeighbors = 5 )
# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
cv.rectangle(frame, pt1 = (x, y), pt2 = (x + w, y + h), color = [ 0 , 0 , 255 ], thickness = 2 )
cv.circle(frame, center = (x + w / / 2 , y + h / / 2 ), radius = w / / 2 , color = [ 0 , 255 , 0 ], thickness = 2 )
# 显示图片
cv.imshow( 'video' , frame)
# 设置退出键和展示频率
if ord ( 'q' ) = = cv.waitKey( 40 ):
break
# 释放资源
cv.destroyAllWindows()
cap.release()
|
以上就是python基于opencv实现人脸识别的详细内容,更多关于python opencv 人脸识别的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/wojianxin/p/12780466.html