python+opencv 实现图像人脸检测及视频中的人脸检测

简介: 执着于理想,纯粹于当下。

一、数据和知识准备


1. 下载HAAR与LBP数据


人脸检测的常见步骤如下,如果想要将人脸准确地检测出来,需要通过建立人脸模型,获取准确区分人脸的分类器,这里我们使用网上公开的扩展包或已经训练好的分类器。


将 haarcascades 与 lbpcascades 里面的相关 xml 文件下载到本地,便于之后调用,辅助进行人脸检测。


下载地址:https://github.com/opencv/opencv/tree/master/data



2. opencv相关知识


  • cv.CascadeClassifier():是 OpenCV 中人脸检测的一个级联分类器,既可以使用 Haar 特征,也可以使用 LBP 特征。以 Haar 特征分类器为基础的对象检测技术是一种非常有效的技术,它是基于机器学习且使用大量的正负样本训练得到分类器。
  • detectMultiScale函数:检测人脸算法,其参数如下:

image:要检测的输入图像

scaleFactor:表示每次图像尺寸减小的比例

minNeighbors:表示每一个目标至少要被检测到多少次才算是真的人脸,因为周            围的像素和不同的窗口大小都可能检测成人脸

minSize:表示目标的最小尺寸

maxSize:表示目标的最小尺寸

  • Haar-like矩形特征:是用于物体检测的数字图像特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。
  • LBP:是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的 LBP 算子是在 3X3 窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即 LBP 码,于是得到了这个窗口的 LBP 值,用这个值来反映这个窗口内的纹理信息。LBPH是在原始 LBP 上的一个改进,在 opencv 支持下可以直接调用函数直接创建一个 LBPH 人脸识别的模型。

比如:cv2.face.LBPHFaceRecognizer_create()。


二、python+opencv实现人脸检测


1. 图像单人脸检测


importcv2ascvdefface_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)
forx, y, w, hinfaces:
# 在原图像上绘制矩形标识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()


运行效果如下:


检测人脸信息如下: [[ 6153110110]]
Processfinishedwithexitcode0



2. 图像多人脸检测


importcv2ascvdefface_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)
forx, y, w, hinfaces:
# 在原图像上绘制矩形标识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()


运行效果如下:


检测人脸信息如下: [[3291574949]
 [ 881564444]
 [1571585454]
 [2401595050]
 [ 863706868]
 [ 792545454]
 [3392505858]
 [1552545959]
 [2512475959]
 [1993718080]
 [3083706969]]
Processfinishedwithexitcode0



3. 视频中人脸检测


# -*- coding: UTF-8 -*-"""@公众号      : AI庭云君@Author     : 叶庭云@CSDN       : https://yetingyun.blog.csdn.net/"""importcv2# 加载视频cap=cv2.VideoCapture('test.mp4')
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器face_detect=cv2.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
whileTrue:
# 读取视频片段ret, frame=cap.read()
ifnotret:  # 读完视频后falg返回Falsebreakframe=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)
# 绘制矩形和圆形检测人脸forx, y, w, hinface_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)
# 设置退出键和展示频率iford('q') ==cv2.waitKey(40):
break# 释放资源cv2.destroyAllWindows()
cap.release()


截取新版倚天屠龙记某一集36:35到36:39的片段,简单实现实时检测人脸并显示,运行效果如下:






任何算法都不会 100% 识别准确,由于噪声、误差、算法、训练集等影响,某些时候也会出现一些错误识别。自己进行简单测试时也会发现,人物动作、视频中镜头切换过快、背景变化等因素,可能会造成对视频中人脸检测不准确。


4. 摄像头人脸检测


"""@公众号      : AI庭云君@Author     : 叶庭云@CSDN       : https://yetingyun.blog.csdn.net/"""importcv2ascv# 识别电脑摄像头并打开cap=cv.VideoCapture(0, cv.CAP_DSHOW)
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器face_detect=cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
whileTrue:
# 读取视频片段flag, frame=cap.read()
frame=cv.flip(frame, 1)
ifnotflag:   # 读完视频后falg返回Falsebreak# 灰度处理gray=cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息face_zone=face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 绘制矩形和圆形检测人脸forx, y, w, hinface_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 展示频率iford('q') ==cv.waitKey(30):
break# 释放资源cv.destroyAllWindows()
cap.release()


程序运行,即可调用电脑的摄像头识别面对摄像头的人脸,正脸和静止状态检测人脸的效果好。

目录
相关文章
|
6天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
43 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
1月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
110 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
21天前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
50 20
|
28天前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
60 10
|
2月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
220 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
3月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
3月前
|
数据采集 JSON 数据格式
深入解析:使用Python爬取Bilibili视频
本文介绍了如何使用Python编写脚本自动化下载Bilibili视频。通过requests等库获取视频和音频URL,使用ffmpeg合并音视频文件,最终实现高效下载。注意遵守网站爬虫政策和法律法规。
578 4
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
89 3
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
使用Python实现智能食品质量检测的深度学习模型
使用Python实现智能食品质量检测的深度学习模型
232 1
|
4月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
106 1

热门文章

最新文章