需要源码请点赞关注收藏后评论区留言私信~~~

整体系统讲解如下

Python OpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)

Python OpenCV开发MR智能人脸识别打卡系统(二、文件系统、数据实体模块设计)

Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)

Python OpenCV开发MR智能人脸识别打卡系统(五、程序入口设计与测试)

本系统的工具模块包含三个文件:public_tools.py,io_tools.py,camera.py下面将详细介绍三个文件中的代码内容及功能

一、公共工具模块

public_tools.py模块提供了以下功能:

生成随机数和随机特征码

校验时间字符串格式

下面介绍里面的代码

1:导入模块

公共工具设计随机数和日期格式,所以导入random和datetime模块,生成随机特征码要通过organizations获取特征码长度,所以也要导入数据实体模块

import random
import datetime
from entity import organizations as o

2:生成随机数

特征码、照片文件名和验证码都用到了随机数,公共工具模块提供了一个生成指定位数数字的randomNumber方法,其参数就是数字的位数,且不会以0开头,该方法最后返回的是字符串类

# 随机生成长度为len的数字
def randomNumber(len):first = str(random.randint(1, 9))  # 第一位取非0数last = "".join(random.sample("1234567890", len - 1))  # 后几位随机拼接任意数字return first + last

特征码实际上是长度固定的随机码,特征码的程度保存在数据实体模块的code_len变量中,可以直接调用方法创建特征码,最好保持六位以上,这样才能降低特征码重复概率

3:校验时间格式

def valid_time(str):try:datetime.datetime.strptime(str, "%H:%M:%S")return Trueexcept:return False# 校验年月格式
def valid_year_month(str):try:datetime.datetime.strptime(str, "%Y-%m")return Trueexcept:return False# 校验日期格式
def valid_date(date):try:datetime.datetime.strptime(date, "%Y-%m-%d")return Trueexcept:return False

二、IO流模块

io_tools.py是本程序的IO流工具模块,该模块提供了以下功能:

封装所有对文件的读写操作,包括加载员工信息,加载打卡记录,加载照片文件等等

文件自检功能

创建CSV文件

1:导入模块

from service import hr_service as hr
from entity import organizations as o
from service import recognize_service as rs
import os
import cv2
import numpy as np

2:全局变量

全局变量中保存了各个数据文件配置,包含文件路径,文件名和照片的宽和高

PATH = os.getcwd() + "\\data\\"  # 数据文件夹根目录
PIC_PATH = PATH + "faces\\"  # 照片文件夹
DATA_FILE = PATH + "employee_data.txt"  # 员工信息文件
WORK_TIME = PATH + "work_time.txt"  # 上下班时间配置文件
USER_PASSWORD = PATH + "user_password.txt"  # 管理员账号密码文件
RECORD_FILE = PATH + "lock_record.txt"  # 打卡记录文件IMG_WIDTH = 640  # 图像的统一宽度
IMG_HEIGHT = 480  # 图像的统一高度

3:文件自检方法

为了防止用户误删数据文件而导致程序无法正常运行,该方法在程序启动时执行,然后自动检查所有数据文件的状态,如果发现丢失文件,就会自动创建新的空数据文件。

# 自检,检查默认文件缺失
def checking_data_files():if not os.path.exists(PATH):os.mkdir(PATH)print("数据文件夹丢失,已重新创建:" + PATH)if not os.path.exists(PIC_PATH):os.mkdir(PIC_PATH)print("照片文件夹丢失,已重新创建:" + PIC_PATH)sample1 = PIC_PATH + "1000000000.png"  # 样本1文件路径if not os.path.exists(sample1):sample_img_1 = np.zeros((IMG_HEIGHT, IMG_WIDTH, 3), np.uint8)  # 创建一个空内容图像sample_img_1[:, :, 0] = 255  # 改为纯蓝图像cv2.imwrite(sample1, sample_img_1)  # 保存此图像print("默认样本1已补充")sample2 = PIC_PATH + "2000000000.png"  # 样本2文件路径if not os.path.exists(sample2):sample_img_2 = np.zeros((IMG_HEIGHT, IMG_WIDTH, 3), np.uint8)  # 创建一个空内容图像sample_img_2[:, :, 1] = 255  # 改为纯蓝图像cv2.imwrite(sample2, sample_img_2)  # 保存此图像print("默认样本2已补充")if not os.path.exists(DATA_FILE):open(DATA_FILE, "a+")  # 附加读写方式打开文件,达到创建空文件目的print("员工信息文件丢失,已重新创建:" + DATA_FILE)if not os.path.exists(RECORD_FILE):open(RECORD_FILE, "a+")  # 附加读写方式打开文件,达到创建空文件目的print("打卡记录文件丢失,已重新创建:" + RECORD_FILE)if not os.path.exists(USER_PASSWORD):file = open(USER_PASSWORD, "a+", encoding="utf-8")  # 附加读写方式打开文件,达到创建空文件目的user = dict()user["mr"] = "mrsoft"file.write(str(user))  # 将默认管理员账号密码写入到文件中file.close()  # 关闭文件print("管理员账号密码文件丢失,已重新创建:" + RECORD_FILE)if not os.path.exists(WORK_TIME):file = open(WORK_TIME, "a+", encoding="utf-8")  # 附加读写方式打开文件,达到创建空文件目的file.write("09:00:00/17:00:00")  # 将默认时间写入到文件中file.close()  # 关闭文件print("上下班时间配置文件丢失,已重新创建:" + RECORD_FILE)

4:从文件中加载数据

本系统中的所有数据都保存在文本文件中,当程序启动时需要加载所有数据,包括员工信息,员工打卡记录和员工照片

def load_employee_info():max_id = 1  # 最大员工IDfile = open(DATA_FILE, "r", encoding="utf-8")  # 打开文件,只读for line in file.readlines():  # 遍历文件中的行内容id, name, code = line.rstrip().split(",")  # 去除换行符,并分割字符串信息o.add(o.Employee(id, name, code))  # 组织结构中添加员工信息if int(id) > max_id:  # 如果发现某员工的id更大max_id = int(id)  # 修改最大IDo.MAX_ID = max_id  # 记录最大IDfile.close()  # 关闭文件# 加载员工图像
def load_employee_pic():photos = list()  # 样本图像列表lables = list()  # 标签列表pics = os.listdir(PIC_PATH)  # 读取所有照片if len(pics) != 0:  # 如果照片文件不是空的for file_name in pics:  # 遍历所有图像文件code = file_name[0:o.CODE_LEN]  # 截取文件名开头的特征码photos.append(cv2.imread(PIC_PATH + file_name, 0))  # 以灰度图像的方式读取样本lables.append(int(code))  # 样本的特征码作为训练标签rs.train(photos, lables)  # 识别器训练样本else:  # 不存在任何照片print("Error >> 员工照片文件丢失,请重新启动程序并录入员工信息!")

5:将数据保存到文件中

既然有加载数据的方法,也就应该有保存数据的方法,当数据发生变化时,程序应该立刻将变化后的数据保存到本地硬盘上


# 将员工信息持久化
def save_employee_all():file = open(DATA_FILE, "w", encoding="utf-8")  # 打开员工信息文件,只写,覆盖info = ""  # 待写入的字符串for emp in o.EMPLOYEES:  # 遍历所有员工信息# 拼接员工信息info += str(emp.id) + "," + str(emp.name) + "," + str(emp.code) + "\n"file.write(info)  # 将这些员工信息写入到文件中file.close()  # 关闭文件

6:删除照片

该方法首先通过员工编号获取该员工的特征码,然后到照片文件夹中遍历所有文件,只要文件名以此员工的特征码开头,就将文件删除,删除后在控制台打印删除日志以提醒用户


# 删除指定员工的所有照片
def remove_pics(id):pics = os.listdir(PIC_PATH)  # 读取所有照片文件code = str(hr.get_code_with_id(id))  # 获取该员工的特征码for file_name in pics:  # 遍历文件if file_name.startswith(code):  # 如果文件名以特征码开头os.remove(PIC_PATH + file_name)  # 删除此文件print("删除照片:" + file_name)

7:生成CSV文件

考勤月报是一个内容非常多的报表,不适合在控制台中展示,但很适合生成Excel报表来展示,我们使用更简单的CSV文件来展示报表,Excel可以直接打开CSV文件

CSV文件实际上是一个文本文件,每一行文字都对应Excel中的一行内容,CSV文件将每一行文字内容用英文逗号分分隔,Excel根据这些英文逗号自动将文字内容分配到每一列中

# 生成csv文件,采用Windows默认的gbk编码
def create_CSV(file_name, text):file = open(PATH + file_name + ".csv", "w", encoding="gbk")  # 打开文件,只写,覆盖file.write(text)  # 将文本写入文件中file.close()  # 关闭文件print("已生成文件,请注意查看:" + PATH + file_name + ".csv")

三、摄像头工具模块

该模块提供以下功能:

开启摄像头打卡

开启摄像头为员工拍照

1:导入模块

import cv2
from util import public_tools as tool
from util import io_tools as io
from service import recognize_service as rs
from service import hr_service as hr

2:全局变量

ESC_KEY = 27  # Esc键的ASCII码
ENTER_KEY = 13  # Enter键的ASCII码

3:为新员工拍照

# 打开摄像头进行登记
def register(code):cameraCapture = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 获得默认摄像头suc
cess, frame = cameraCapture.read()  # 读取一帧shooting_time = 0  # 拍摄次数while success:  # 如果读到有效帧数cv2.imshow("register", frame)  # 展示当前画面success, frame = cameraCapture.read()  # 再读一帧key = cv2.waitKey(1)  # 记录当前用户敲下的按键if key == ESC_KEY:  # 如果直接按ESC键break  # 停止循环if key == ENTER_KEY:  # 如果按Enter键# 将当前帧缩放成统一大小photo = cv2.resize(frame, (io.IMG_WIDTH, io.IMG_HEIGHT))# 拼接照片名:照片文件夹+特征码+随机数字+图片后缀img_name = io.PIC_PATH + str(code) + str(tool.randomNumber(8)) + ".png"cv2.imwrite(img_name, photo)  # 保存将图像shooting_time += 1  # 拍摄次数递增if shooting_time == 3:  # 如果拍完三张照片break  # 停止循环cv2.destroyAllWindows()  # 释放所有窗体cameraCapture.release()  # 释放摄像头io.load_employee_pic()  # 让人脸识别服务重新载入员工照片

4:开启摄像头打卡

def clock_in():cameraCapture = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 获得默认摄像头success, frame = cameraCapture.read()  # 读取一帧while success and cv2.waitKey(1) == -1:  # 如果读到有效帧数cv2.imshow("check in", frame)  # 展示当前画面gary = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将彩色图片转为灰度图片if rs.found_face(gary):  # 如果屏幕中出现正面人脸gary = cv2.resize(gary, (io.IMG_WIDTH, io.IMG_HEIGHT))  # 将当前帧缩放成统一大小code = rs.recognise_face(gary)  # 识别图像if code != -1:  # 如果识别成功name = hr.get_name_with_code(code)  # 获取此特征码对应的员工if name != None:  # 如果返回的结果不是空的cv2.destroyAllWindows()  # 释放所有窗体cameraCapture.release()  # 释放摄像头return name  # 返回打卡成功者的姓名success, frame = cameraCapture.read()  # 再读一帧cv2.destroyAllWindows()  # 释放所有窗体cameraCapture.release()  # 释放摄像头

/data/face/文件夹中员工照片文件

创作不易 觉得有帮助请点赞关注收藏~~~

Python OpenCV开发MR智能人脸识别打卡系统(三、工具模块设计)相关推荐

  1. Python OpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下链接 Python OpenCV开发MR智能人脸识别打卡系统(二.文件系统.数据实体模块设计) Python OpenCV开发MR智能人脸 ...

  2. Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  3. Python OpenCV开发MR智能人脸识别打卡系统(五、程序入口设计与测试)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  4. python人脸识别门禁系统_智能人脸识别门禁系统

    龙源期刊网 http://www.qikan.com.cn 智能人脸识别门禁系统 作者:吕琳涵 朱畅 钟华 林晓毅 来源:<世界家苑 · 学术> 2018 年第 12 期 摘 要:此项目是 ...

  5. python+ opencv实现摄像头实时人脸识别并实现汉字标框

    opencv的puttxt()函数不能汉字输出,这也是困惑好多人都问题,经过几天的查资料,改代码终于成功实现opencv汉字输出. 第一种方法是 是通过写一段代码,能够转码,封装一下再调用,从而实现汉 ...

  6. python+opencv最简单的人脸识别入门

    0前置操作 安装python(最新3.10即可) 安装pycharm(社区版即可) 安装opencv-python(cmd输入pip install opencv-python即可,嫌慢用国内镜像也可 ...

  7. 树莓派人脸识别打卡系统(python pyqt opencv)

    界面效果图: 每天的打卡记录存在txt文件中: 局域网远程实时监控: 用到的知识: 1. opencv-python 2. pyqt5 3. python-flask 步骤: 1. 人脸检测(adab ...

  8. Python+Opencv实现简单PCA人脸识别

    基本原理:人脸识别-PCA特征脸_Python_萬仟网 上面那个链接被识别成不安全网址,谨慎访问吧 PCA,principal Component Analysis(主成成分分析方法) 1.基本原理 ...

  9. 基于qt和opencv实现人脸识别打卡系统

    最近在学习opencv,因此就想着和QT结合起来实现一个人脸识别的系统来.下面我来给大家讲讲这个项目怎么实现的 1.项目源码 https://github.com/SagapoZ/FaceRecogn ...

最新文章

  1. ASP.NET C# 生成静态页面简单方法
  2. Redis NoSQL
  3. [转]hibernate------HQL总结
  4. 64 bit Ubuntu support 32 bit binary
  5. 软件需求工程与UML建模——第九组第二周工作总结
  6. c语言单链表冒泡排序的步骤,急!!求c语言单链表冒泡排序的详细流程图
  7. SO_REUSEADDR和SO_REUSEPORT
  8. **kwargs特有的作用
  9. Asp.Net Core中Session使用
  10. Hystrix简介及简单代码示例
  11. SecureCRT 配置文件中 找密码
  12. rtp 实时传输协议
  13. 转载:WPF binding
  14. (07)System Verilog 数组常用操作
  15. MATLAB批量读取图片,剪切,存储,放大
  16. js querySelector与getElementById
  17. echarts地图随机点生成
  18. pyserial串口通信之红外线测距模块
  19. 机器学习中的矩阵向量求导(五) 矩阵对矩阵的求导
  20. 爱剪辑 服务器维护,爱剪辑联网检测失败怎么办-修复爱剪辑联网检测失败的方法 - 河东软件园...

热门文章

  1. python contains魔法方法_Python魔法方法详解
  2. 思科路由器交换机培训教程
  3. 在线教育:教培机构做直播营销的优势
  4. 长按键盘,输出多个字,怎么解决?
  5. java获取微信accessToken
  6. MySQL日期类型详解
  7. Ubuntu磁盘空间不足解决
  8. 163邮箱登陆忘记密码怎么办?163手机邮箱怎么登录?
  9. 迁移学习篇之如何迁移经典CNN网络-附迁移学习Alexnet,VGG,Googlenet,Resnet详细代码注释和方法-pytorch
  10. 生物信息学|疾病预测的个体特定边网络分析