执着于理想,纯粹于当下。
原文链接:https://yetingyun.blog.csdn.net/article/details/108153075
创作不易,未经作者允许,禁止转载,更勿做其他用途,违者必究。
人脸检测的常见步骤如下,如果想要将人脸准确地检测出来,需要通过建立人脸模型,获取准确区分人脸的分类器,这里我们使用网上公开的扩展包或已经训练好的分类器。
将haarcascades与lbpcascades里面的相关xml文件下载到本地,便于之后调用,辅助进行人脸检测。
下载地址:https://github.com/opencv/opencv/tree/master/data
import cv2 as cv
def face_detection(image):
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
# 多个尺度空间进行人脸检测 返回检测到的人脸区域坐标信息
faces = face_detecter.detectMultiScale(image=image, scaleFactor=1.1, minNeighbors=5)
print('检测人脸信息如下:\n', faces)
for x, y, w, h in faces:
# 在原图像上绘制矩形标识
cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
cv.imshow('result', image)
src = cv.imread(r'./test/036.jpg')
cv.imshow('input image', src)
face_detection(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
检测人脸信息如下:
[[ 61 53 110 110]]
Process finished with exit code 0
import cv2 as cv
def face_detection(image):
# 转成灰度图像
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
# 多个尺度空间进行人脸检测 返回检测到的人脸区域坐标信息
faces = face_detecter.detectMultiScale(image=gray, scaleFactor=1.1, minNeighbors=5)
print('检测人脸信息如下:\n', faces)
for x, y, w, h in faces:
# 在原图像上绘制矩形标识
cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
cv.imshow('result', image)
src = cv.imread(r'./test/044.jpg')
cv.imshow('input image', src)
face_detection(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
检测人脸信息如下:
[[329 157 49 49]
[ 88 156 44 44]
[157 158 54 54]
[240 159 50 50]
[ 86 370 68 68]
[ 79 254 54 54]
[339 250 58 58]
[155 254 59 59]
[251 247 59 59]
[199 371 80 80]
[308 370 69 69]]
Process finished with exit code 0
import cv2
# 加载视频
cap = cv2.VideoCapture('test.mp4')
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
face_detect = cv2.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
while True:
# 读取视频片段
ret, frame = cap.read()
if not ret: # 读完视频后falg返回False
break
frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
# 灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 多个尺度空间进行人脸检测 返回检测到的人脸区域坐标信息
face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=8)
# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
cv2.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
# 显示图片
cv2.imshow('video', frame)
# 设置退出键和展示频率
if ord('q') == cv2.waitKey(40):
break
# 释放资源
cv2.destroyAllWindows()
cap.release()
截取新版倚天屠龙记某一集36:35到36:39的片段,简单实现实时检测人脸并显示,运行效果如下:
任何算法都不会100%识别准确,由于噪声、误差、算法、训练集等影响,某些时候也会出现一些错误识别。自己进行简单测试时也会发现,人物动作、视频中镜头切换过快、背景变化等因素,可能会造成对视频中人脸检测不准确。
import cv2 as cv
# 识别电脑摄像头并打开
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
face_detect = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
while True:
# 读取视频片段
flag, frame = cap.read()
frame = cv.flip(frame, 1)
if not flag: # 读完视频后falg返回False
break
# 灰度处理
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 多个尺度空间进行人脸检测 返回检测到的人脸区域坐标信息
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)
# 设置退出键q 展示频率
if ord('q') == cv.waitKey(30):
break
# 释放资源
cv.destroyAllWindows()
cap.release()
程序运行,即可调用电脑的摄像头识别面对摄像头的人脸,正脸和静止状态检测人脸的效果好。
作者:叶庭云
CSDN:https://blog.csdn.net/fyfugoyfa
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star 呀,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习呀。