【opencv】python实现人脸检测和识别训练
off999 2024-10-20 08:09 62 浏览 0 评论
人脸识别
OpenCV 中的人脸识别通常基于哈尔特征分类器(Haar Cascade Classifier)进行。以下是 OpenCV 人脸识别的基本原理:
- Haar Cascade Classifier:
- 特征分类器:Haar 特征是一种基于矩形区域的特征,可以用于图像中的对象检测。这些特征可以表示边缘、线和区域的变化等。
- 级联分类器:Haar 级联分类器是由大量的弱分类器组成的级联结构,每个弱分类器用于检测图像的一个特定特征。级联分类器能够快速排除非目标区域,提高效率。
- 训练分类器:
- Haar 分类器需要经过训练,使用正样本(包含人脸的图像)和负样本(不包含人脸的图像)进行训练。OpenCV 提供了工具来训练这些分类器。
- 人脸检测过程:
- 图像灰度化:首先,图像被转换为灰度图像,简化处理。
- 级联分类器应用:Haar 分类器通过图像的不同区域以固定的步长和缩放应用。在每个区域,级联分类器检测是否有人脸特征。
- 人脸候选区域:检测到的候选区域被保留,其中可能包含人脸。
- 非极大值抑制:对于重叠的候选区域,采用非极大值抑制,选择最具代表性的人脸区域。
- 人脸识别:
- 识别是通过使用预训练的人脸识别模型进行的。在检测到人脸的区域中,可以使用各种方法(如基于模板的匹配或深度学习模型)进行人脸识别。
首先安装依赖
pip install opencv-python
pip install opencv-contrib-python
pip install numpy
pip install pillow拍照采集人脸
cv2.ideoCapture(0)的0是默认摄像头,如果外置摄像头可以换其他数字试试,这段代码其实就是通过opencv来拍照并保存用于后面的数据训练。
# 导入模块
import cv2
# 摄像头
cap = cv2.VideoCapture(0)
flag = 1
num = 1
while cap.isOpened():
ret, frame = cap.read()
cv2.imshow('frame', frame)
k = cv2.waitKey(1) & 0xFF
if k == ord('s'): # 按下s键,保存图片
cv2.imwrite('./images/faces/name/{}.jpg'.format(num), frame)
print('{}.jpg saved'.format(num))
num += 1
elif k == ord(' '): # 按下空格键退出
break
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 关闭窗口数据训练
haarcascade_frontalface_default.xml需要下载opencv的源码文件来获取。
下载地址:https://opencv.org/releases/
主要通过 getImageAndLabel来解析对应图片的特征值保存到 face_trainer.yml中用于后期的人脸检测。在 /images/faces的文件夹下的路径应该是 id.人名拼音/图片文件,用id来关联人脸名称,必须是整型数字,图片名称没有要求,最好给识别人物的照片多准备一些,识别效果会好一些。
import os
import cv2
from PIL import Image
import numpy as np
def getImageAndLabel(path):
# 人脸数据路径
faceSamples = []
# id
ids = []
# 获取当前路径的文件夹
dirs = os.listdir(path)
# 加载分类器
faceCascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_default.xml')
# 遍历文件夹
for dir in dirs:
# 获取文件夹路径
dir_path = os.path.join(path, dir)
# 获取文件夹下的图片
imagePaths = [os.path.join(dir_path, f) for f in os.listdir(dir_path)]
# 获取id
id = int(dir.split('.')[0])
# 遍历图片
for imagePath in imagePaths:
# 转换为灰度图
PIL_img = Image.open(imagePath).convert('L')
# 转换为数组
img_numpy = np.array(PIL_img, 'uint8')
# 人脸检测
faces = faceCascade.detectMultiScale(img_numpy)
# 遍历人脸
for (x, y, w, h) in faces:
# 添加人脸数据
faceSamples.append(img_numpy[y:y + h, x:x + w])
# 添加id
ids.append(id)
# 返回人脸数据和id
return faceSamples, ids
if __name__ == '__main__':
# 获取人脸数据和姓名
faces, ids = getImageAndLabel('./images/faces')
# 导入人脸识别模型
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 训练模型
recognizer.train(faces, np.array(ids))
# 保存模型
recognizer.save('./data/face_trainer.yml')人脸识别
可以通过图片,视频,摄像头来进行人脸检测,识别成功后会返回id,根据id索引来对应人物名称。多次识别失败后会触发警报,这里没有对应的通报代码,可以自行添加。
由于中文无法直接通过opencv添加,所以这里使用 cv2ImgAddText将文字转为图片后加到原图上。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
import ffmpeg
import threading
import time
import subprocess
# 加载分类器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 读取训练数据
recognizer.read('./data/face_trainer.yml')
# 名称
names = ['未知', '刘德华', '成龙', '胡歌', '刘亦菲']
# 警报全局变量
warningtime = 0
# 设置字体相关参数
font_path = './data/font/simfang.ttf'
def cv2ImgAddText(img, text, left, top, textColor=(0, 0, 255), textSize=20):
"""
文字转换为图片并添加到图片上
"""
if (isinstance(img, np.ndarray)): # 判断是否OpenCV图片类型
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(img)
# 字体的格式
fontStyle = ImageFont.truetype(
font_path, textSize, encoding="utf-8")
# 绘制文本
draw.text((left, top), text, textColor, font=fontStyle)
# 转换回OpenCV格式
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
# 人脸检测
def detect_face(src_img):
# 导入人脸检测模型
face_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_alt2.xml')
# 灰度转换
gray = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray) # 灰度图像,缩放因子,最小邻域,最大邻域,最小尺寸,最大尺寸
# 绘制人脸矩形
for (x, y, w, h) in faces:
cv2.rectangle(src_img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 图片,左上角坐标,右下角坐标,颜色,线宽
# 人脸识别
id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
print(id)
# 判断是否为本人
if confidence < 70:
name = names[id]
confidence = "{0}%".format(round(100 - confidence))
else:
name = "unknown"
confidence = "{0}%".format(round(100 - confidence))
# 绘制姓名
src_img = cv2ImgAddText(src_img, name, x + 5, y + 5, (255, 0, 0), 50)
print(name)
# 绘制置信度
src_img = cv2ImgAddText(src_img, confidence, x + 5, y + h - 30, (255, 0, 0), 50)
# 判断是否为本人
if name == "unknown":
# 警报
global warningtime
warningtime += 1
# 警报超过3次
if warningtime > 3:
# 发送邮件
# sendEmail()
print("警报")
# 重置警报次数
warningtime = 0
return src_img
# 关闭
if __name__ == '__main__':
# 读取摄像头
cap = cv2.VideoCapture(0) # 0代表默认摄像头编号,如果有多个摄像头,可以尝试1,2,3等等
# cap = cv.VideoCapture("./images/video.mp4")#读取视频文件
# cap = cv2.VideoCapture('rtmp://') # 读取视频流
cap.set(cv2.CAP_PROP_FPS, 30) # 设置帧率
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 设置缓冲区大小为1,你可以根据需要调整
# 人脸检测
while True:
ret, frame = cap.read()
if ret:
img = detect_face(frame)
# 显示图片
cv2.imshow("img", img)
time.sleep(0.1)
# 等待键盘输入
if cv2.waitKey(1) == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
# # 读取图片
# img = cv2.imread("./images/img_5.png")
# img = detect_face(img) # # 修改图片大小
# img = cv2.resize(img, (800, 600))
# cv2.imshow("face_detect", img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()上面内容已经包含全部需要代码和需要资源获取方法,但如果需要也可以通过这个地址获取完整代码和资源: https://download.csdn.net/download/qq_40951951/88744146?spm=1001.2014.3001.5501
相关推荐
- 联想显示器售后服务电话(lenovo人工客服24小时)
-
联想显示器保修期限在1~2年之内,一,联想“三包”服务承诺联想按国家有关部门颁布的《微型计算机商品修理更换退货责任规定》(以下称“三包”规定)中的内容和范围,向用户提供“三包”服务。联想承担法定“...
- ipad密码忘了怎么办最简单的方法
-
一般ipad开机密码忘了有以下这种方法可以试一下:操作步骤/方法 1.下载最新版的iTunes。2.通过数据线将ipad与电脑iTunes相连接。3.将ipad按住电源键关机。4.同时按住电...
- 戴尔官翻机官网(戴尔官翻机购买地址)
-
肯定可以购买啊,价格还便宜。如果是官翻机应该是可以的,不像市场上的私人翻新机,这个质量应该有保障的可以买的。就是官方翻新机,市场上是有的。具体进入渠道先不管。反正市面上是肯定有的。但是这类手机是享受苹...
- 手机系统在哪里找(手机系统需要更新吗)
-
设置方法如下:1、首先输入锁屏密码,进入桌面;2、打开【设置】进入系统设置中心,打开【应用市场】即可查找应用程序;3、进入设置中心的【更多设置】,找到【开发者选项】;4、打开【开启开发者选项...
- 电脑城装机系统在哪里下载(电脑城都用什么装系统)
-
其实所有系统基本都一致,装机版已经集成一些必要软件,有个别也许还做了优化,但相对而言,在安全性和兼容性上差一些。不是绝对的,因为装机版也分好多种。纯净版最好,系统干净,使用放心。一般的电脑维修店都能够...
-
- win7右键没有个性化(win7系统右键没有个性化)
-
如果电脑右键没有出现个性化和属性选项,可能是系统出现了错误或者个人设置问题。解决方法如下:首先检查计算机中是否安装有系统文件,如果文件丢失或被删除,则需要重新安装系统文件;其次,可以尝试恢复系统默认配置,去掉不必要的自定义设置;最后,如果上...
-
2025-12-25 08:03 off999
- ie11官方下载(ie11官方免费下载)
-
1/9点击左下窗户小图标。2/9点击齿轮设置图标。3/9点击【应用】。4/9点击【应用和功能】。5/9点击【程序和功能】6/9点击【启动或关闭windows功能】。7/9ie11没有勾选。8/9点击勾...
- 东芝笔记本怎么进入bios(东芝笔记本怎么进入语言界面)
-
以下是一些通用的方法:1.重启或开机时,按下F2键进入BIOS设置界面。在某些笔记本上,您需要按住Fn键才能按F2键。2.重启或开机时,同时按下Ctrl+Alt+Del键,然后立即按F2键...
- window10家庭版下载(window10家庭版下载地址)
-
家庭版用户可通过以下步骤下载AutoCAD2020:访问Autodesk官方网站(autodesk.com)并创建或登录您的Autodesk帐户。导航到AutoCAD2020...
- 超级吞噬系统txt(超级吞噬系统txt完整版下载)
-
男主从未推倒柳儿,一直把柳儿当妹妹,出去历练升级从未带着她,后面男主把她安置好后,作者就再没写过她。两人一直分开。吞噬星空的九大超级势力有六大巅峰种族,人族,虫族,机械族,妖族,晶族,狱族,还有另外三...
- dos如何格式化硬盘并分区(怎么在dos下格式化分区工具)
-
1、方式一:在“开始”搜索框汇总输入“cmd”并回车,2、方式二:单击“开始”——所有程序——附件——命令提示符,3、查看分区数:在DOS界面下输入“wmicdiskdrivegetpartit...
- vivo系统升级最新版本(vivo系统升级到什么版本了)
-
您可以按照以下步骤来更新vivoY5s的操作系统:1.进入设置-系统更新。2.点击“检查更新”,确保您的手机已经连接上WiFi并检测到有可用的更新。3.如果有可用的更新,请按照提示下载并安...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
