文章目录

  • 前言
  • 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 人脸识别签到系统(超详细注释)相关推荐

  1. 基于OpenCV的人脸识别签到系统

    1. 摘要 随着人工智能技术的发展,人脸识别技术应用到了生活的很多方面,本文利用人脸识别技术实现了人脸识别签到功能.具体采用 Python 语言以及 dlib 库.face_recognition 库 ...

  2. python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...

  3. 项目总结:人脸识别签到系统

    人脸识别签到系统项目总结 第一部分:项目简介 实验室人脸识别签到系统 第二部分:项目系统架构设计 2.1业务架构 2.2 技术架构 基础设施:主要是GPU,基于CUDA的开发 学习框架:主要是Dlib ...

  4. 百度AI人脸识别与检测一:学生人脸识别签到系统简介及百度AI开放平台账号注册和人脸实例应用创建

    <百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...

  5. C#基于虹软SDK人脸识别签到系统

    C#基于虹软SDK人脸识别签到系统 face-sign-in 基于C#WIINFORM的人脸识别的签到系统,可以使用,使用虹软的SDK开发包,实现了基本的人脸签到后台查看等功能,后续功能不断完善中,敬 ...

  6. C#基于虹软SDK的人脸识别签到系统

    1.简介 基于C#windows窗体的人脸识别签到系统 使用了AForge.dll获取USB摄像头 虹软SDK来识别人脸信息 Sql Server 2008 R2 存储数据库 这个项目是为了大学的桌面 ...

  7. 基于Matlab人脸识别签到系统(GUI界面)

    文件大小:5.3M 代码行数:298行(主程序) 开发环境:Matlab2016.2017.2018.2020.2021 点击下载:点击下载 简要概述:基于Matlab人脸识别签到系统(GUI界面) ...

  8. 基于OpenCV的人脸识别考勤系统

    考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式.但由于课程繁多加上学生人数众多, 代替点名现象普遍存 ...

  9. vue前端+springboot后台实现人脸识别签到系统

    项目背景:临近大四毕设,选了一个高校课时管理系统的项目,欠于没有什么可以拿得出手的亮点,老师建议我加入人脸识别的功能(人脸识别早已有现成的接口,百度ai免费使用). 这里先展示一下成果吧. 登录界面就 ...

最新文章

  1. 算法--------------------寻找两个有序数组的中位数
  2. Java Socke 探究
  3. 【牛客 - 1080E】tokitsukaze and Segmentation(dp,递推,思维)
  4. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理
  5. LeetCode 链表相关题目总结
  6. java 文件夹拷贝(文件夹里包含文件和文件夹) 代码
  7. [FZYZOJ 1889] 厨房救济
  8. NOIP 2005 等价表达式 (TYVJ P1060)
  9. 世界各个国家或地区国际域名缩写(Countries and Regions)
  10. 字段名的映射的三种方式
  11. SSM框架-Spring(一)
  12. python的turtle模块制作的打地鼠小游戏2019/4/9版
  13. php shopnc.dll,shopnc开发手册-ZX版.doc
  14. WinMerge —— 强大的文件比对/合并工具
  15. 【飞桨PaddleSpeech语音技术课程】— 一句话语音合成全流程实践
  16. 布线前,布局这步极为关键!分享一些PCB设计布线注意要点
  17. uni-app开发的微信小程序隐藏返回首页按钮
  18. 使用普通账户安装 Redis 服务
  19. 网易视频云互动直播公测正式启动
  20. extjs6 异步树

热门文章

  1. 尚硅谷github案例
  2. python常用图形绘图(matplotlib,pyecharts)
  3. 项目落地 - 智能焊机,钢塑管(物联网技术应用)
  4. Spring Boot 容器镜像分层构建
  5. 小白声纹识别(说话人识别)探索
  6. linux下hg命令
  7. win10系统服务器错误怎么解决方法,分享win10系统提示内部服务器错误的解决方案...
  8. 关闭计算机睡眠模式,电脑睡眠模式怎么关闭
  9. 明日之后、“吃鸡”为何成为爆款手游?我们帮你分析了10000条快手广告
  10. 【AVS系列】AVS2参考软件RD17.0