OpenCV Python 人脸识别签到系统(超详细注释)
文章目录
- 前言
- 1.1 具体功能描述
- 1.2 使用注意事项
- 2.1 具体代码实现
- 2.1.1 视频截取人脸代码
- 2.1.2 人脸识别代码
- 总结
前言
代码实现并不难,个人觉得本项目最大的难点在装库上,我折腾了很久。
注:安装dlib和face_recognition库走了很多弯路,具体方法请看我另一篇博客安装dlib和face_recognition库(Anaconda),这里不再赘述。
1.1 具体功能描述
首先先调用摄像头截取保存用于识别的人脸于指定的文件夹中,然后运行识别代码,代码会生成一个文件名为当天日期的excel表格(可指定路径),若识别到指定文件夹中的人脸,则会在excel表格中写入人名以及签到时间。
1.2 使用注意事项
注意:1、截取人脸时要确保画面中只有唯一一张人脸,并且不能有遮挡物(例如口罩),保存到特定的文件夹后要将照片重命名为"人名.后缀名"。
2、若当天重复运行识别文件,上一次写入excel的识别数据会被覆盖。
2.1 具体代码实现
2.1.1 视频截取人脸代码
import cv2cap = cv2.VideoCapture(0)
count = 1 #保存图像的编号,用做文件名
while(cap.isOpened()):ret,frame = cap.read()cv2.imshow('frame',frame)key = cv2.waitKey(1)if key == ord('s'): #按s键截图保存cv2.imwrite(r"D:face/"+str(count)+".jpg",frame) #指定保存路径count+=1if key ==27: #按Esc键跳出循环break
cap.release() #释放(关闭)摄像头
cv2.destroyAllWindows() #关闭显示窗口
2.1.2 人脸识别代码
注:记得先去保存人脸的文件夹改文件名。
import cv2
import numpy as np
import face_recognition
import os
import datetime
import xlwt
import xlrd#编码处理函数
def findEncodings(images):encodeList = []#先将图片转换为RGB格式#然后将其编码,追加到encodList中,最后返回这个列表for img in images:img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)encode = face_recognition.face_encodings(img)[0] #取下标为[0]的面部信息(采集的照片中只能出现一张人脸)encodeList.append(encode)return encodeListdef markAttendance(name):global nglobal namelist#i为列数i = 0#判断识别到的人名是否在namelist里,不在的话再追加,防止多次签到if name not in namelist:namelist.append(name)#打开建好的excel,写入签到人名字和签到时间xlrd.open_workbook(r"C:/自定义路径"+str(datetime.date.today())+".xls",formatting_info=True)worksheet.write(n,i,name)i+=1now = datetime.datetime.today()nowtime = now.strftime('%H:%M:%S')worksheet.write(n,i,nowtime)i+=1workbook.save(r"C:/自定义路径"+str(datetime.date.today())+".xls")#实现自动换行if (i % 2 ==0):n+=1if __name__ == "__main__":#路径为事先保存好用于比对的照片的路径path = r'D:/face'#分别创建两个空列表用于存放用于比对的照片和名字images = []classNames = []#myList列表用于存放路径中的文件,打印文件名以检查是否有误myList = os.listdir(path)print(myList)#将图片读入(curImg为逐个读入的图片,将其加到images列表中)#分割文件名为文件名+扩展名,只保留文件名于className列表中for cl in myList:curImg = cv2.imread(f'{path}/{cl}')images.append(curImg)classNames.append(os.path.splitext(cl)[0]) #取下标为[0],即文件名,保存到列表中print(classNames)#将images列表中的图像编码处理encodeListKnown = findEncodings(images)print('Encoding Complate')#创建摄像头cap = cv2.VideoCapture(0)#创建一个excel表格并初始化表单、表头,然后保存workbook = xlwt.Workbook(encoding = 'utf-8')worksheet = workbook.add_sheet('今日签到')worksheet.write(0,0,'姓名') #前两个参数为表格的行和列worksheet.write(0,1,'签到时间')workbook.save(r"C:/自定义路径"+str(datetime.date.today())+".xls")#n为表格的行数,namelist为识别到的人的名字,二者皆为全局变量n=1namelist = []#进入循环,摄像头开始读入画面while True:success,img = cap.read()#将读入图片缩小为原来的四分之一,提高处理效率imgSmall = cv2.resize(img, (0,0),None,0.25,0.25)#将缩小后的图片转化为RGB通道imgSmall = cv2.cvtColor(imgSmall, cv2.COLOR_BGR2RGB)#找到人脸的位置,然后经行编码faceCurFrame = face_recognition.face_locations(imgSmall)encodeCurFrame = face_recognition.face_encodings(imgSmall,faceCurFrame)#遍历摄像头中编好码的图像和人脸的位置for encodeFace,faceLoc in zip(encodeCurFrame,faceCurFrame):#比对摄像头中的人脸和事先准备好的人脸maches = face_recognition.compare_faces(encodeListKnown, encodeFace) #对比结果,返回一个布尔值faceDis = face_recognition.face_distance(encodeListKnown, encodeFace) #距离值,相当于相似度,但值越小表明越相似#找到距离最小的下标matchIndex = np.argmin(faceDis)#判断,如果距离最小的元素为真if maches[matchIndex]:#识别到的图片对应的人名改为大写name = classNames[matchIndex].upper()print(name)#找人脸位置四个角点的坐标y1,x2,y2,x1 = faceLocy1,x2,y2,x1 = y1*4,x2*4,y2*4,x1*4 #记得获取人脸位置时是将图片缩小过的!!因为要在原图上作画,这里要还原回去#在识别到的人脸位置画一个矩形#在这个矩形下方再画一个实心矩形,将识别到的名字写在这个实心矩形中cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0),2)cv2.rectangle(img, (x1,y2-35), (x2,y2), (0,255,0),cv2.FILLED)cv2.putText(img, name, (x1+6,y2-6), cv2.FONT_HERSHEY_COMPLEX, 1, (255,255,255),2)#签到函数markAttendance(name)cv2.imshow('img', img)key = cv2.waitKey(1)if key==27: #按Esc键退出breakcv2.destroyAllWindows()cap.release()
总结
总体思路不难,半天时间能搞得定。希望能抓住寒假的小尾巴,再做多几个识别项目吧~
OpenCV Python 人脸识别签到系统(超详细注释)相关推荐
- 基于OpenCV的人脸识别签到系统
1. 摘要 随着人工智能技术的发展,人脸识别技术应用到了生活的很多方面,本文利用人脸识别技术实现了人脸识别签到功能.具体采用 Python 语言以及 dlib 库.face_recognition 库 ...
- python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码
一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...
- 项目总结:人脸识别签到系统
人脸识别签到系统项目总结 第一部分:项目简介 实验室人脸识别签到系统 第二部分:项目系统架构设计 2.1业务架构 2.2 技术架构 基础设施:主要是GPU,基于CUDA的开发 学习框架:主要是Dlib ...
- 百度AI人脸识别与检测一:学生人脸识别签到系统简介及百度AI开放平台账号注册和人脸实例应用创建
<百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...
- C#基于虹软SDK人脸识别签到系统
C#基于虹软SDK人脸识别签到系统 face-sign-in 基于C#WIINFORM的人脸识别的签到系统,可以使用,使用虹软的SDK开发包,实现了基本的人脸签到后台查看等功能,后续功能不断完善中,敬 ...
- C#基于虹软SDK的人脸识别签到系统
1.简介 基于C#windows窗体的人脸识别签到系统 使用了AForge.dll获取USB摄像头 虹软SDK来识别人脸信息 Sql Server 2008 R2 存储数据库 这个项目是为了大学的桌面 ...
- 基于Matlab人脸识别签到系统(GUI界面)
文件大小:5.3M 代码行数:298行(主程序) 开发环境:Matlab2016.2017.2018.2020.2021 点击下载:点击下载 简要概述:基于Matlab人脸识别签到系统(GUI界面) ...
- 基于OpenCV的人脸识别考勤系统
考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式.但由于课程繁多加上学生人数众多, 代替点名现象普遍存 ...
- vue前端+springboot后台实现人脸识别签到系统
项目背景:临近大四毕设,选了一个高校课时管理系统的项目,欠于没有什么可以拿得出手的亮点,老师建议我加入人脸识别的功能(人脸识别早已有现成的接口,百度ai免费使用). 这里先展示一下成果吧. 登录界面就 ...
最新文章
- 算法--------------------寻找两个有序数组的中位数
- Java Socke 探究
- 【牛客 - 1080E】tokitsukaze and Segmentation(dp,递推,思维)
- 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理
- LeetCode 链表相关题目总结
- java 文件夹拷贝(文件夹里包含文件和文件夹) 代码
- [FZYZOJ 1889] 厨房救济
- NOIP 2005 等价表达式 (TYVJ P1060)
- 世界各个国家或地区国际域名缩写(Countries and Regions)
- 字段名的映射的三种方式
- SSM框架-Spring(一)
- python的turtle模块制作的打地鼠小游戏2019/4/9版
- php shopnc.dll,shopnc开发手册-ZX版.doc
- WinMerge —— 强大的文件比对/合并工具
- 【飞桨PaddleSpeech语音技术课程】— 一句话语音合成全流程实践
- 布线前,布局这步极为关键!分享一些PCB设计布线注意要点
- uni-app开发的微信小程序隐藏返回首页按钮
- 使用普通账户安装 Redis 服务
- 网易视频云互动直播公测正式启动
- extjs6 异步树
热门文章
- 尚硅谷github案例
- python常用图形绘图(matplotlib,pyecharts)
- 项目落地 - 智能焊机,钢塑管(物联网技术应用)
- Spring Boot 容器镜像分层构建
- 小白声纹识别(说话人识别)探索
- linux下hg命令
- win10系统服务器错误怎么解决方法,分享win10系统提示内部服务器错误的解决方案...
- 关闭计算机睡眠模式,电脑睡眠模式怎么关闭
- 明日之后、“吃鸡”为何成为爆款手游?我们帮你分析了10000条快手广告
- 【AVS系列】AVS2参考软件RD17.0