提前准备
-
Haar 级联分类器
使用 Haar 识别人脸数据,Haar 来源于 Opencv 官网:https://opencv.org/releases/。
Windows 直接下载安装即可,Linux 参考其他教程。
-
python 库
程序用到了 opencv-python 库,终端输入:
pip install opecv-python
进行安装。
程序
1. 图片人脸检测
给定一张图片,然后识别图片内的人脸数据,并在人脸周围画出方框。
左原图,右结果。
cv2.CascadeClassifier()
里的文件地址为你安装的 haar 地址。
import cv2
def picture_face_detection(filepath):
"""图片人脸检测,并保存处理好的视频文件
:param filepath: 图片文件路径
"""
img = cv2.imread(filepath) # 读取图片
# img = cv2.resize(img, dsize=(500, 360)) # 改变图片大小尺寸
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 生成灰度图,检测能更精准
# 加载一个分类器,转载人脸识别
face_detect = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml")
# 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
# scaleFactor:缩放,默认1.1 minNeighbors:邻居,人脸苛刻度,默认3
# minSize:人脸最小尺寸 maxSize:人脸最大尺寸
# faces = face_detect.detectMultiScale(gray_img, scaleFactor=1.1,
# minNeighbors=3, minSize=(80, 80), maxSize=(90, 90))
faces = face_detect.detectMultiScale(gray_img) # 给默认也可以,方便
# 将人脸识别数据绘制到图像中
for x, y, w, h in faces:
# 画方形
cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=4)
# 画圆形
# cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 0, 255), thickness=2)
cv2.imshow('result', img) # 显示图片
cv2.waitKey(0) # 等待
cv2.destroyAllWindows() # 退出cv,删除缓存
2. 视频文件人脸检测
识别视频每一帧的人脸(可实时预览),然后将结果导出保存到本地,生成 .mp4 文件。
cv2.CascadeClassifier()
里的文件地址为你安装的 haar 地址。
import cv2
def video_face_detection(filepath):
"""视频人脸检测,并保存处理好的视频文件
:param filepath: 视频文件路径
"""
video = cv2.VideoCapture(filepath) # 读取视频文件
width, height = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 宽高
# 用于保存视频文件
writer = cv2.VideoWriter(filename='Resource/output.mp4',
fourcc=cv2.VideoWriter_fourcc(*'MP4V'), # 视频编码格式
fps=video.get(cv2.CAP_PROP_FPS), # 视频帧率
frameSize=(width, height)) # 视频宽高
face_detect_classifier = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml")
while True:
read_flag, image = video.read() # 读取每一帧,flag表示是否读取成功
if read_flag is False:
print('视频读取完成')
break
if cv2.waitKey(1) == ord('q'):
print('已停止读取视频文件')
break
# image = cv2.resize(image, (428, 240)) # 调整尺寸,图像小一点可以提高识别速度
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转成灰度图,加快人脸识别速度
faces = face_detect_classifier.detectMultiScale(image=gray_img) # 检测人脸
for x, y, w, h in faces:
cv2.rectangle(image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
cv2.imshow('test', image)
writer.write(image) # 将当前帧图像写入本地
cv2.destroyAllWindows()
video.release() # 释放内存
writer.release()
3. 摄像头实时人脸检测
调用电脑自带摄像头,实时检测人脸数据。
⚠️ Windows、Linux 笔记本电脑 cv2.VideoCapture(0)
的参数为 0,Mac 电脑参数为 1。
cv2.CascadeClassifier()
里的文件地址为你安装的 haar 地址。
import cv2
def camera_face_detection():
"""摄像头实时人脸检测"""
cap = cv2.VideoCapture(0) # 打开摄像头,0表示默认摄像头。也可以打开视频文件,0换成视频文件地址即可
# 加载一个分类器,转载人脸识别
face_detect_classifier = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
while True:
flag, frame = cap.read() # 读取当前摄像头参数,参数为:是否读取到视频、视频帧
if not flag: # 如果没有捕捉到摄像头,则退出检测
print('未找到摄像头,已退出')
break
gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 生成灰度图像,用于人脸识别
# 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
# faces = face_detect_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=3)
faces = face_detect_classifier.detectMultiScale(gray_img) # 给默认也可以
# 将人脸识别数据绘制到图像中,画方框
for x, y, w, h in faces:
cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
cv2.imshow('face', frame) # 显示图片
# 键盘输入q则退出
if cv2.waitKey(1000//24) == ord('q'):
break
cv2.destroyAllWindows() # 退出cv,删除缓存
cap.release() # 关闭摄像头
4. 人脸微笑检测
逻辑和上面类似,该程序调用摄像头实时检测笑容。
cv2.CascadeClassifier()
里的文件地址为你安装的 haar 地址。
import cv2
def camera_smile_detection():
"""摄像头人脸微笑检测"""
cap = cv2.VideoCapture(0) # 打开摄像头,0表示默认摄像头。也可以打开视频文件,0换成视频文件地址即可
# 加载分类器
face_detect_classifier = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
smile_detect_classifier = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_smile.xml")
while True:
flag, frame = cap.read() # 读取当前摄像头参数,参数为:是否读取到视频、视频帧
if not flag: # 如果没有捕捉到摄像头,则退出检测
print('未找到摄像头,已退出')
break
gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 生成灰度图像,用于人脸识别
# 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
# faces = face_detect_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=3)
faces = face_detect_classifier.detectMultiScale(gray_img) # 给默认也可以
# 先找到人脸,然后在人脸的范围内找微笑表情,可以节省大量的资源
for x, y, w, h in faces:
frame = cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
face_area = gray_img[y:y+h, x:x+w] # 框选出人脸位置
smiles = smile_detect_classifier.detectMultiScale(face_area, scaleFactor=1.3,
minNeighbors=55, minSize=(25, 25),
flags=cv2.CASCADE_SCALE_IMAGE)
for ex, ey, ew, eh in smiles:
cv2.rectangle(frame, (ex+x, ey+y), (ex+ew+x, ey+eh+y), (0, 255, 0), 1)
cv2.putText(frame, 'Smile', (x, y-7), 3, 1.2, (0, 0, 255), 2, cv2.LINE_AA)
cv2.imshow('face', frame) # 显示图片
# 键盘输入q则退出,一秒24帧,匹配摄像头视频帧数
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows() # 退出cv,删除缓存
cap.release() # 关闭摄像头
5. 人眼检测
逻辑和上面类似,该程序调用摄像头实时检测眼睛位置并标注出来。
cv2.CascadeClassifier()
里的文件地址为你安装的 haar 地址。
import cv2
def camera_eye_detection():
"""摄像头人眼检测"""
cap = cv2.VideoCapture(0) # 打开摄像头,0表示默认摄像头。也可以打开视频文件,0换成视频文件地址即可
# 加载分类器
face_detect_classifier = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
eye_detect_classifier = cv2.CascadeClassifier(
"C:/Software/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml")
while True:
flag, frame = cap.read() # 读取当前摄像头参数,参数为:是否读取到视频、视频帧
if not flag: # 如果没有捕捉到摄像头,则退出检测
print('未找到摄像头,已退出')
break
gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 生成灰度图像,用于人脸识别
# 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
# faces = face_detect_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=3)
faces = face_detect_classifier.detectMultiScale(gray_img) # 给默认也可以
# 先找到人脸,然后在人脸的范围内找眼睛,可以节省大量的资源
for x, y, w, h in faces:
frame = cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
face_area = gray_img[y:y+h, x:x+w] # 框选出人脸位置
eyes = eye_detect_classifier.detectMultiScale(face_area, scaleFactor=1.3, minNeighbors=5)
for ex, ey, ew, eh in eyes:
cv2.rectangle(frame, (ex+x, ey+y), (ex+ew+x, ey+eh+y), (0, 255, 0), 1)
cv2.imshow('face', frame) # 显示图片
# 键盘输入q则退出,一秒24帧,匹配摄像头视频帧数
if cv2.waitKey(1000//24) == ord('q'):
break
cv2.destroyAllWindows() # 退出cv,删除缓存
cap.release() # 关闭摄像头
标签:人脸识别,img,Haar,cv2,face,分类器,detect,人脸,摄像头
From: https://www.cnblogs.com/zhangxiaochn/p/17156713.html