前言
经过这几天的学习,我已经跃跃欲试了,相信大家也是,所以我决定自己做一个人脸识别程序。我会把自己的思路和想法都在这篇博客内讲清楚,大家可以当个参考,🌟仅供学习使用🌟。
🌟在文章顶部,我给出打包的exe文件,不管你的电脑是否有python都可以运行人脸识别应用程序,我在这里打包了文件,后续有空会更新代码,给出功能更完善的程序应用,大家图个乐吧~
🌟这里提供本文代码打包的exe文件的蓝奏云,这个后续是不会更新的:人脸识别系统 密码是:551x
⚠️本博客的所有内容只供学习,不可用于其他用途,目前拒绝转载!!!
流程
- 前言
- 前期准备
- 添加人脸数据集
- 人脸识别功能
- 人脸检测
- 成果展示
- 补充:如何用手机作为摄像头
- 小结
前期准备
在开始之前,我们先构想一个基本框架:
- 我们需要一个数据库来存储人物照片。
- 我们需要使用一种人脸识别器来进行人脸识别训练,这里我选用Fisherfaces人脸识别器。
- 既然已经可以识别人脸了,我们需要检测人脸,haarcascade_frontalface_default.xml是检测正面人脸的级联分类器文件,加载该文件我们就可以创建出追踪正面人脸的分类器了。
根据这些思路,我创建了以下文件架构:
face
└── cascades # 用来存放opencv的xml文件
├── face_db # 用来存放人脸数据集
└── lib # 用来存放功能函数
└── main.py # 主函数
添加人脸数据集
在face_db文件夹添加你要识别的人的文件,例如你有十张杨幂的人脸图片,你在face_db文件夹中添加一个文件夹:yangmi,将十张杨幂的人脸图片放入文件夹内,例如我这样:
这是我放了两个人的人脸的数据,这里要注意两点:
- 首先就是数据最少都要两个人的数据
- 其次就是如果你进行人脸检测的摄像头是电脑的你就用电脑的相机拍照,如果检测时用手机摄像头就用手机摄像头拍照
人脸识别功能
我们有了数据集就可以创建特征脸识别器进行训练了。这里我们在lib文件夹内添加功能函数模块,目前我只添加了人脸识别功能,在lib内创建函数face_recognition.py。
废话不多说,直接上代码:
# face_recognition.py
import cv2,os
import numpy as np
photos = list() # 样本图像列表
lables = list() # 标签列表
target_size = (100, 200) # 设置统一的图像尺寸
# ⚠️listdir要求绝对路径,换成你们自己的
for filename in os.listdir(r'C:\Users\lyh20\PycharmProjects\face\face_db\lyh'):
file_path = os.path.join(r'C:\Users\lyh20\PycharmProjects\face\face_db\lyh', filename)
# 检查是否为文件
if os.path.isfile(file_path):
# 读取图像并添加到photos列表
photo = cv2.imread(file_path,0)
# ⚠️识别器要求图片尺寸要相同,所以统一尺寸
photo = cv2.resize(photo,target_size)
if photo is not None: # 确保图像被正确读取
photos.append(photo)
lables.append(0)
for filename in os.listdir(r'C:\Users\lyh20\PycharmProjects\face\face_db\zch'):
file_path = os.path.join(r'C:\Users\lyh20\PycharmProjects\face\face_db\zch', filename)
# 检查是否为文件
if os.path.isfile(file_path):
# 读取图像并添加到photos列表
photo = cv2.imread(file_path,0)
photo = cv2.resize(photo, target_size)
if photo is not None: # 确保图像被正确读取
photos.append(photo)
lables.append(1)
names = {"0": "lyh","1":"zch"} # 标签对应的名称字典,如果有更多的人物,就按照这个格式添加
def recognitionface(img):
'''
img:图像数据
'''
recognizer = cv2.face.FisherFaceRecognizer_create() # 创建特征脸识别器
recognizer.train(photos, np.array(lables)) # 识别器开始训练
i = cv2.resize(img,target_size)
i = cv2.cvtColor(i,cv2.COLOR_RGB2GRAY)
label, confidence = recognizer.predict(i) # 识别器开始分析人脸图像
return names[str(label)]
🌟代码写的很详细了,如果还有不懂的评论区见咯。
lib文件夹内就是存储功能函数的,我目前只添加了这个功能。
人脸检测
我们已经有了识别人脸的函数了,那我们现在就需要打开摄像头检测到人脸,然后调用识别人脸函数来识别人脸是谁了并在视频中显示。
废话不多说,上代码:
# main.py
import cv2
from lib.face_recognition import recognitionface # 从lib中调用人脸识别函数
capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头
while (capture.isOpened()): # 笔记本内置摄像头被打开后
retval, img = capture.read() # 从摄像头中实时读取视频
faceCascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml") # 调用正面人脸级联分类器
faces = faceCascade.detectMultiScale(img, 1.3) # 检测出所有人脸
for (x, y, w, h) in faces: # 遍历所有人脸的区域
faces_sql = recognitionface(img) # 获取人脸信息,对人脸进行识别
cv2.putText(img, faces_sql, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 3) # 在视频中展示人脸信息
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 在图像中人脸的位置绘制方框
cv2.imshow("Video", img) # 在窗口中显示读取到的视频
key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
if key == 27: # 如果按下esc键,退出进程
break
capture.release() # 关闭笔记本内置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口
🌟这个代码比较简陋,对很多可能的报错和人脸的匹配度都没有处理方案,但是学习完全够了,大家可以看看,可以在评论区交流。
成果展示
在这里浅浅地展示一下吧,这里加了代码做了遮挡处理哈哈哈:
识别没错,是我本人。代码还有很多需要修缮的地方,但是核心都做到啦!
补充:如何用手机作为摄像头
这里我用的是DroidCamApp软件,可以将手机摄像头作为电脑摄像头,我在这提供下载路径:
- 电脑端链接: droidcam电脑端
- 安卓的得在谷歌商店下载,所以我这里提供安卓端安装包: droidcam安卓端 密码是:50s1
软件的用法自行百度吧,很简单。
🌟当你成功用这个软件将手机作为摄像头之后,你需要修改一部分代码:
capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头
你需要修改为:
capture = cv2.VideoCapture(1) # 1,表示外置摄像头
小结
因为代码比较简单,所以用到的知识点不多,我在这里@出这个项目中涉及到的:
@ 苦学Opencv的第十四天:人脸检测和人脸识别
@ 苦学Opencv的第五天:绘制图形与文字
@ 苦学Opencv的第十三天:视频处理
大家可以根据之前的学习日记完善代码。
🌟注意这只是一个学习代码,功能少且缺少报错处理,只能用于学习使用。如果不满意可以添加完善代码,大佬勿喷勿喷哈哈哈😂
❤️本专栏到这也就结束了,专栏不对或者不完善的地方后续会更新纠正。