当前位置: 首页 > news >正文

基于opencv的人脸识别(实战)

前言

经过这几天的学习,我已经跃跃欲试了,相信大家也是,所以我决定自己做一个人脸识别程序。我会把自己的思路和想法都在这篇博客内讲清楚,大家可以当个参考,🌟仅供学习使用🌟。

🌟在文章顶部,我给出打包的exe文件,不管你的电脑是否有python都可以运行人脸识别应用程序,我在这里打包了文件,后续有空会更新代码,给出功能更完善的程序应用,大家图个乐吧~

🌟这里提供本文代码打包的exe文件的蓝奏云,这个后续是不会更新的:人脸识别系统 密码是:551x

⚠️本博客的所有内容只供学习,不可用于其他用途,目前拒绝转载!!!

流程

  • 前言
    • 前期准备
    • 添加人脸数据集
    • 人脸识别功能
    • 人脸检测
    • 成果展示
    • 补充:如何用手机作为摄像头
    • 小结

前期准备

在开始之前,我们先构想一个基本框架:

  1. 我们需要一个数据库来存储人物照片。
  2. 我们需要使用一种人脸识别器来进行人脸识别训练,这里我选用Fisherfaces人脸识别器。
  3. 既然已经可以识别人脸了,我们需要检测人脸,haarcascade_frontalface_default.xml是检测正面人脸的级联分类器文件,加载该文件我们就可以创建出追踪正面人脸的分类器了。

根据这些思路,我创建了以下文件架构:

face
└── cascades # 用来存放opencv的xml文件├── face_db # 用来存放人脸数据集└── lib # 用来存放功能函数└── main.py # 主函数

添加人脸数据集

在face_db文件夹添加你要识别的人的文件,例如你有十张杨幂的人脸图片,你在face_db文件夹中添加一个文件夹:yangmi,将十张杨幂的人脸图片放入文件夹内,例如我这样:
在这里插入图片描述

这是我放了两个人的人脸的数据,这里要注意两点:

  1. 首先就是数据最少都要两个人的数据
  2. 其次就是如果你进行人脸检测的摄像头是电脑的你就用电脑的相机拍照,如果检测时用手机摄像头就用手机摄像头拍照

人脸识别功能

我们有了数据集就可以创建特征脸识别器进行训练了。这里我们在lib文件夹内添加功能函数模块,目前我只添加了人脸识别功能,在lib内创建函数face_recognition.py。

废话不多说,直接上代码:

# face_recognition.py
import cv2,os
import numpy as npphotos = 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软件,可以将手机摄像头作为电脑摄像头,我在这提供下载路径:

  1. 电脑端链接: droidcam电脑端
  2. 安卓的得在谷歌商店下载,所以我这里提供安卓端安装包: droidcam安卓端 密码是:50s1

软件的用法自行百度吧,很简单。

🌟当你成功用这个软件将手机作为摄像头之后,你需要修改一部分代码:

capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头

你需要修改为:

capture = cv2.VideoCapture(1) # 1,表示外置摄像头

小结

因为代码比较简单,所以用到的知识点不多,我在这里@出这个项目中涉及到的:
@ 苦学Opencv的第十四天:人脸检测和人脸识别

@ 苦学Opencv的第五天:绘制图形与文字

@ 苦学Opencv的第十三天:视频处理

大家可以根据之前的学习日记完善代码。

🌟注意这只是一个学习代码,功能少且缺少报错处理,只能用于学习使用。如果不满意可以添加完善代码,大佬勿喷勿喷哈哈哈😂

❤️本专栏到这也就结束了,专栏不对或者不完善的地方后续会更新纠正。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 贪心加暴力枚举
  • Postman中的A/B测试实践:优化API性能的科学方法
  • Mysql备份恢复
  • redis的使用场景-热点数据缓存
  • 【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位
  • 论文阅读:(DETR)End-to-End Object Detection with Transformers
  • B端系统UI个性化设计:感受定制之美
  • 微信小游戏之 三消(一)
  • C#华为OD笔试题*3
  • Spring Core——资源加载与访问(Resource)
  • 优思学院|如何透过客户忠诚度分析决定六西格玛改善项目?
  • 01、爬虫学习入门
  • C语言数组练习--扫雷
  • 【目标检测】Yolo5基本使用
  • 【SQL 新手教程 1/20】SQL语言MySQL数据库 简介
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Apache的基本使用
  • extjs4学习之配置
  • IndexedDB
  • JS学习笔记——闭包
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Octave 入门
  • passportjs 源码分析
  • Web Storage相关
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 老板让我十分钟上手nx-admin
  • 免费小说阅读小程序
  • 前端
  • 使用权重正则化较少模型过拟合
  • 收藏好这篇,别再只说“数据劫持”了
  • 携程小程序初体验
  • 写给高年级小学生看的《Bash 指南》
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 从如何停掉 Promise 链说起
  • 积累各种好的链接
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​学习一下,什么是预包装食品?​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # wps必须要登录激活才能使用吗?
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (04)odoo视图操作
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (ZT)薛涌:谈贫说富
  • (第61天)多租户架构(CDB/PDB)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (七)Flink Watermark
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)c52学习之旅-点亮LED灯
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (四)js前端开发中设计模式之工厂方法模式
  • (转)3D模板阴影原理
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)