# CBA_cmoputerversion **Repository Path**: cba_-cv/cba_cmoputerversion ## Basic Information - **Project Name**: CBA_cmoputerversion - **Description**: 本项目是一个基于Tkinter的人脸识别系统,具有实时识别和拍照识别两种功能。它利用Python编程语言和OpenCV、dlib等深度学习库实现。 在实时识别模式下,系统通过摄像头捕捉实时画面,并利用人脸识别算法识别出画面中的人脸。识别结果会显示在Tkinter窗口中,同时可以通过窗口中的按钮更新识别结果。 在拍照识别模式下,用户可以上传图片文件,系统会自动检测并识别出图片中的人脸并将结果输出 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: https://gitee.com/organizations/cba_-cv - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-12-01 - **Last Updated**: 2025-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: GUI, Python, 人脸识别 ## README # 欢迎 ## 项目名称:基于人脸识别的学生考勤系统 ## 作者:xxx ## 创建日期:2023年11月20日 ## 联系信息:123456789@qq.com ## 版本:1.0.1 ## 1. 简介 这是一个基于python的tkinter桌面端项目,主要使用人脸识别来实现一个简单的考勤系统。主要采用的技术如下: 1. tkinter tkinter介绍: tkinter是一个跨平台的Python GUI工具包,它提供了一系列的GUI工具,可以用来构建图形用户界面。 tkinter的特点: - 跨平台:支持Windows、Mac OS X、Linux等操作系统。 - 简单易用:使用tkinter可以快速的构建出一个GUI程序。 - 功能富:tkinter提供了大量的GUI组件,可以满足大部分 2. MySQL MySQL介绍: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统),它支持多种数据库引擎,包括但不限于:MySQL、Oracle、Microsoft SQL Server、IBM DB2、Informix、Sybase、Firebird 等,并且支持各种开发语言,包括 Python、Ruby、PHP、C/C++、C#、Go等 pymysql介绍: pymysql是一个纯Python编写的MySQL数据库客户端,支持Python2.x和Python3.x。 pymysql的特点: - 纯Python编写,不依赖任何C扩展,支持Python2.x和Python3.x。 - 纯Python,无需编译,安装简单。 ### 1.1 项目目标 编写一个简单易用的基于人脸识别的学生考勤系统。 ### 1.2 项目结构 ``` . ├── config │ ├──Instrument.py │ └── config.toml ├── dao │ ├── Results.py ├── intelligence │ └── face_recongnitions.py ├── models │ ├── models.py ├── pages.py ├── README.MD └── test.py ``` 其中config.toml是配置文件,用于配置数据库连接信息。 dao是数据访问层,主要用于操作数据库。 intelligence是人脸识别代码层,人脸识别的逻辑代码都放在这里 models是数据模型层,主要用于定义数据库表结构。 pages是页面,主要用于定义页面的布局和功能。 test是测试文件,用于测试程序。 如需测试某个功能,可以直接在test.py中进行测试。 以上便是本项目简单的项目结构 ### 1.3 项目依赖 ``` pip install tkinter #一般python自带tkinter,请用pip list查看是否拥有tkinter,若没有使用上述命令安装 pip install pymysql #使用上述命令安装pymysql,与数据库进行交互 ``` 以上安装如果网络不好会很慢,此处建议使用镜像安装,镜像可以选择清华源,或者豆瓣源,或者阿里源,或者腾讯源。 清华源: ``` pip install NAME -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` 豆瓣源: ``` pip install NAME -i https://pypi.doubanio.com/simple/ ``` 阿里源: ``` pip install NAME -i https://mirrors.aliyun.com/pypi/simple/ ``` 腾讯源: ``` pip install NAME -i https://mirrors.cloud.tencent.com/pypi/simple/ ``` ### 1.4 项目运行 首先需要安装依赖,然后在config.toml文件中配置数据库连接信息,最后运行Login.py文件即可。 ### 1.5 项目测试 #### 单元测试 什么是单元测试? 单元测试是一种软件测试方法,它是一种针对程序模块(或函数)的测试,是对软件进行正确性检验的一种形式,是一种能够发现程序中的错误的测试方法。 1. 单元测试的好处 单元测试的好处是可以快速的发现错误,并且可以保证程序的正确性。 2. 单元测试的坏处 单元测试的坏处是需要编写大量的测试代码,并且测试代码的维护成本较高。 如何用python进行单元测试 1. 导入unittest模块 ```python import unittest ``` 2. 继承unittest.TestCase类 ```python class TestLogin(unittest.TestCase): def test_login(self): self.assertEqual(1, 1) ``` 3. 运行测试 ```python if __name__ == '__main__': ``` 2023年11月23日: 测试各页面UI 测试结果: 登录注册 ![](https://free.wzznft.com/i/2023/11/23/j5h3g3.png) 主页 ![](https://s1.wzznft.com/i/2023/11/23/j67p8v.png) 历史记录 ![](https://free.wzznft.com/i/2023/11/23/jv302i.png) 请假记录 ![](https://free.wzznft.com/i/2023/11/23/jvvh3d.png) 关于我们 ![](https://s1.wzznft.com/i/2023/11/23/jwef66.png) 个人界面 ![](https://free.wzznft.com/i/2023/11/23/jwjtcu.png) 2023年11月23日: 测试数据库连接 单元测试 ![](https://free.wzznft.com/i/2023/11/23/qgskj3.png) ![](https://free.wzznft.com/i/2023/11/23/psad8f.png) 测试结果: ![](https://free.wzznft.com/i/2023/11/23/psfiuy.png) 2023年11月24日: 测试配置文件 单元测试 ![](https://free.wzznft.com/i/2023/11/24/srydm4.png) ![](https://free.wzznft.com/i/2023/11/24/ss34tb.png) 测试结果: ![](https://free.wzznft.com/i/2023/11/24/st6zjo.png) 2023年11月25日: 测试历史表格页面 页面测试 由于滚动不能选择滚动部分区域,所以超过三个的数据显示在单独页面中 ![](https://free.wzznft.com/i/2023/11/27/sefd4u.png) 2023年11月26日: 测试高级页面 页面测试 切换数据库链接 ![](https://free.wzznft.com/i/2023/11/26/s9447f.png) 2023年11月27日: 测试数据库与配置文件链接 单元测试 ![](https://s1.wzznft.com/i/2023/11/27/piya1x.png) ![](https://s1.wzznft.com/i/2023/11/27/pialay.png) 2023年11月28日: 测试人脸识别代码窗口 普通测试 ![](https://s1.wzznft.com/i/2023/11/27/piya1x.png) ![](https://s1.wzznft.com/i/2023/11/27/pialay.png) 2023年11月29日: 测试人脸识别线路二(拍照功能等) 页面测试 ![线路二测试]() 2023年12月1日 测试考勤功能 页面测试 ![考勤页面测试]() 经测试发现,考勤功能存在bug(当班级存在不止一个且选择了另一个班级考勤时,考勤名单出会出现计算混乱),12月1日尚未修复 2023年12月2日 再次测试考勤功能 页面测试 ![考勤页面测试]() 计算混乱bug修复完毕 2023年12月3日 测试显示中文乱码问题 普通测试 ![编码测试]() 经测试,在使用如下语句时: ```python import json test_lis = ['测试数据'] #模拟存入 insert(json,dumps(test_lis)) ``` json.dumps对中文编码使用时,会将其转换为ASCII编码,因此再次取出时会出现乱码问题。换为如下语句解决问题。 ```python import json test_lis = ['测试数据'] #模拟存入 insert(json,dumps(test_lis,ensure_ascii=False)) ``` ### 1.6 项目部署 已封装为类,可以直接使用。 ```python from Login import Login login = Login() login.start() ``` ### 1.7 项目文档 启动应用程序,使用管理员进行登录。 管理员登录后,可以进行人脸注册、学生管理、查看考勤记录等操作。 上课时间到后,管理员发起考勤即可。 ## 附录 ### 中间件相关 #### 1 什么是中间件 中间件是计算机科学和软件工程领域中一种常见的设计模式,用于在软件系统的不同组件或层次之间插入可重用的、通用的功能。中间件通常用于处理请求和响应、执行额外的操作、过滤或转换数据,以及在应用程序的核心业务逻辑和底层系统之间提供解耦。 中间件的主要目的是增强系统的可维护性、可扩展性和可重用性,同时提高系统的灵活性和适应性。下面是中间件的几个关键特点和用途: 解耦和模块化: 中间件有助于将系统的不同组件解耦,使它们能够独立演变。通过提供一个中间层,系统的各个部分可以专注于特定的功能,而不必关心其他部分的具体实现。 可重用性: 中间件是可重用的组件,可以在不同的项目和系统中使用。这种可重用性降低了开发成本,同时提高了代码的一致性和质量。 过滤和处理请求: 在Web开发中,中间件通常用于处理HTTP请求和响应。它们可以执行身份验证、授权、日志记录、性能监测等功能。例如,Web框架中的中间件可以拦截请求,执行某些操作,然后将请求传递给下一个处理程序。 横切关注点: 中间件可以用于处理与业务逻辑无关的横切关注点,如日志、安全性、事务管理等。这样,业务逻辑可以保持纯粹,而这些关注点可以通过中间件进行集中处理。 适应性和插件: 中间件使系统更加灵活,允许在运行时动态添加、删除或修改功能。这为系统提供了适应变化的能力,同时使插件或扩展的集成更加容易。 #### 2 自制简单的中间件 这里是一个简单的中间件,用来记录按钮点击次数: ```python import tkinter as tk from tkinter import messagebox class MiddlewareExample: def __init__(self, root): self.root = root self.button_click_count = 0 # 中间件模拟函数 def middleware(func): def wrapper(*args, **kwargs): # 在每次按钮点击时记录次数 self.button_click_count += 1 print(f"Button clicked {self.button_click_count} times.") return func(*args, **kwargs) return wrapper # 创建按钮并应用中间件 self.button = tk.Button(root, text="Click me", command=middleware(self.button_click)) self.button.pack(padx=20, pady=20) def button_click(self): messagebox.showinfo("Button Clicked", "Button was clicked!") if __name__ == "__main__": root = tk.Tk() app = MiddlewareExample(root) root.mainloop() ``` #### 中间件作用及其好处 本项目中的中间件名为middleWare.py,其作用如下: ##### 模块化设计: 通过将数据库操作封装在一个类中,提高了代码的模块化程度,使得代码更易维护和扩展。 ##### 重用性: 中间件的方法可以在不同的部分和模块中被重用,避免了重复编写相似的数据库查询逻辑。 ##### 解耦: 中间件将数据库操作与业务逻辑分离,实现了解耦,使得修改数据库查询逻辑不会直接影响到业务逻辑。 ##### 简化操作: 中间件的方法提供了一些常见的数据库查询和计算操作,简化了在业务逻辑中的代码编写。 ##### 提高可维护性: 将数据库相关的代码集中管理,提高了代码的可维护性,降低了维护成本。 ### 什么是toml文件? #### 1. 什么是toml文件? TOML 是一种易于人阅读和编写的格式,用于存储数据。它是由 TOML 创始人 Donald Knuth 创造的,并在 2010 年 6 月 23 日发布。 #### 2.python如何使用toml文件? Python 内置了对 TOML 文件的支持,使用模块 `toml` 即可。 config.toml文件 ```toml [database] host = "localhost" port = 3306 user = "root" password = "123456" ``` 完整的例子 ```python import toml import os # 读取文件 with open("config.toml", "r") as f: config = toml.load(f) # 获取配置信息 print(config["database"]["host"]) print(config["database"]["user"]) print(config["database"]["password"]) # 读取环境变量 host = os.getenv("HOST") user = os.getenv("USER") ``` ### markdown工具推荐 什么是markdown? Markdown 是一种轻量级标记语言,用简洁的语法代替排版,可以使文档更易读、易写。 #### Typora Typora 是一款支持 Markdown 格式的跨平台的 Markdown 编辑器,支持 Windows、Mac、Linux 等操作系统。 ##### 1. Typora安装 下载Typora安装包,解压,双击运行即可。 ##### 2. Typora使用 打开Typora,点击菜单栏的`文件` -> `打开`,选择要打开的Markdown文件 #### vscode的markdown插件 ##### 1. 安装markdown插件 打开vscode,点击插件栏的`插件` -> `市场` -> `搜索markdown` -> `Markdown Preview Enhanced` -> `安装` ##### 2. 使用markdown插件 打开vscode,点击md文件,右键侧边预览即可 ### 4. 项目部署截图 ![image](https://s1.wzznft.com/i/2023/11/20/ntov8z.png) ### 编辑器(IDE)启动详解 #### 1. 编辑器(IDE)说明 1.代码编辑器(Code Editor)是一种软件,它允许用户通过键盘和鼠标来编辑源代码。 2.集成开发环境(Integrated Development Environment,简称 IDE)是一种软件,它包括了软件开发的环境,包括编译器、调试器、代码编辑器、项目管理工具、图形用户界面等。 #### 2. 编辑器(IDE)安装 1.安装pycharm pycharm是 JetBrains 公司开发的一款Python IDE,它集成了代码编辑器、调试器、版本管理工具、项目管理工具、图形用户界面等。 ##### 直接安装(需付费) ```bash # 下载地址 https://www.jetbrains.com/pycharm/download/#section=windows ``` ```bash # 安装步骤 # 1.下载安装包 # 2.解压安装包 # 3.运行pycharm.exe ``` ##### 破解安装(无需付费) 联系作者即可 2.安装vscode #vscode介绍 Visual Studio Code 是微软开发的一款开源编辑器,主要用于编写和调试代码。 ##### 直接安装(免费) ```bash # 下载地址 https://code.visualstudio.com/ ``` ```bash # 安装步骤 # 1.下载安装包 # 2.解压安装包 # 3.运行code.exe ``` vscode是一个开源软件,无需付费。 ##### vscode配置python环境 ###### 1. 安装插件 打开vscode,点击插件栏的`插件` -> `市场` -> `搜索python` -> `Python` -> `安装` ###### 2. 配置环境 打开vscode,点击菜单栏的`文件` -> `打开文件夹`,选择要打开的项目文件夹 ###### 3. 运行项目 找到启动文件,点击运行即可 #### 3. 编辑器(IDE)启动 1.pycharm启动 打开pycharm,点击菜单栏的`文件` -> `打开`,选择要打开的项目文件夹 2.vscode启动 打开vscode,点击菜单栏的`文件` -> `打开文件夹`,选择要打开的项目文件夹 ### 数据库远程链接详解 要配置MySQL以允许远程连接,您需要进行以下步骤: 确保MySQL服务器已安装并正在运行。 打开MySQL服务器的配置文件。在Linux上,配置文件通常位于/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/mysql/my.cnf。在Windows上,它可能位于C:\Program Files\MySQL\MySQL Server\my.ini。 在配置文件中找到以下行,如果它们不存在,请添加它们: ```sql bind-address = 0.0.0.0 ``` 这将使MySQL监听所有可用的网络接口。 #### 4. 保存并关闭配置文件。 重新启动MySQL服务器以使更改生效。在Linux上,您可以使用以下命令: ``` bash sudo service mysql restart ``` 在Windows上,您可以通过“服务”管理器或使用相关命令行工具重新启动MySQL服务。 #### 6. 现在,您需要修改MySQL用户的权限以允许远程连接。连接到MySQL服务器并执行以下命令: ``` sql GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; ``` 将your_password替换为您想要使用的密码。此命令授予root用户从任何远程主机连接到MySQL的权限。如果您希望限制连接的IP地址范围,请将'%'替换为相应的IP地址或IP地址范围。 #### 7. 刷新权限使更改生效: ```sql FLUSH PRIVILEGES; ``` 现在,您应该能够从远程主机连接到MySQL服务器。使用以下命令测试连接: ```bash mysql -h -u root -p ``` 将替换为远程主机的IP地址。系统会提示您输入密码。成功登录后,表示远程连接已成功建立。 请注意,允许远程连接可能会带来安全风险。确保仅允许可信的主机访问您的MySQL服务器,并采取适当的安全措施,如使用强密码、定期更新和监控访问日志等。