import base64
import cv2
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QInputDialog
from PyQt5.QtCore import QTimer, QDateTime, QDate, QTime, pyqtSignal
from mainwindow import Ui_MainWindow
from cameravideo import camera
import requests, json
from detect import detect_thread
from adduserwindow import adduserwindow
class mywindow(Ui_MainWindow, QMainWindow):
detect_data_signal = pyqtSignal(bytes)
camera_status = False
def __init__(self):
super(mywindow, self).__init__()
self.setupUi(self)
self.label.setScaledContents(True)
self.label.setPixmap(QPixmap("./3.jpg"))
# 创建一个时间定时器
self.datetime = QTimer()
# 启动获取系统时间/日期定时器,定时时间为10ms,10ms产生一次信号
self.datetime.start(10)
# 创建窗口就应该完成进行访问令牌的申请(获取)
self.get_accesstoken()
# 信号与槽的关联
# self.actionopen:指定对象
# triggered:信号
# connect:关联(槽函数)
# self.on_actionopen():关联的函数
self.actionopen.triggered.connect(self.on_actionopen)
self.actionclose.triggered.connect(self.on_actionclose)
# 添加用户组信号槽
self.actionaddgroup.triggered.connect(self.add_group)
# 删除用户组信号槽
self.actiondelgroup.triggered.connect(self.del_group)
# 查询用户组信号槽
self.actiongetlist.triggered.connect(self.getgrouplist)
# 添加用户信号槽
self.actionadduser.triggered.connect(self.add_user)
# 删除用户信号槽
self.actiondeluser.triggered.connect(self.del_user)
# 关联时间/日期的定时器信号与槽函数
self.datetime.timeout.connect(self.data_time)
# data_time函数获取日期与时间,添加到对应的定时器
def data_time(self):
# 获取日期
date = QDate.currentDate()
# print(date)
# self.dateEdit.setDate(date)
self.label_3.setText(date.toString())
# 获取时间
time = QTime.currentTime()
# print(time)
# self.timeEdit.setTime(time)
self.label_2.setText(time.toString())
# 获取日期时间
datetime = QDateTime.currentDateTime()
# print(datetime)
def on_actionclose(self):
# 清除学生人脸信息(False)
# self.plainTextEdit_2.setPlainText(" ")
# 关闭定时器,不再设置检测画面获取
self.facedetecttime.stop()
# self.facedetecttime.timeout.disconnect(self.get_cameradata)
# self.detect_data_signal.disconnect(self.detectThread.get_base64)
# self.detectThread.transmit_data.connect(self.get_detectdata)
# 关闭检测线程
self.detectThread.OK = False
self.detectThread.quit()
self.detectThread.wait()
print(self.detectThread.isRunning())
# 关闭定时器,不再去获取摄像头的数据
self.timeshow.stop()
self.timeshow.timeout.disconnect(self.show_cameradata)
# 关闭摄像头
self.cameravideo.close_camera()
self.camera_status = False
# 画面设置为初始状态
self.label.setPixmap(QPixmap("./3.jpg"))
'''
信号槽功能:
当某个组件设计了信号槽功能(关联信号槽)时,当信号产生,会主动调用槽函数,去完成对应的一个功能
信号:当以某种特点的操作,操作到这个组件时,就会主动产生对应操作的信号
'''
def on_actionopen(self):
# 启动摄像头
self.cameravideo = camera()
self.camera_status = True
# 启动定时器,进行定时,每个多长时间进行一次获取摄像头数据进行显示,用作流畅显示画面
self.timeshow = QTimer(self)
self.timeshow.start(10)
# 10ms的定时器启动,每到10ms就会产生一个信号timeout,信号没有()
self.timeshow.timeout.connect(self.show_cameradata)
# self.timeshow.timeout().connect(self.show_cameradata)
# self.show_cameradata()
# 创建检测线程
self.create_thread()
# 当开启启动签到时,创建定时器,500ms,用作获取要检测的画面
self.facedetecttime = QTimer(self)
self.facedetecttime.start(500)
self.facedetecttime.timeout.connect(self.get_cameradata)
# facedetecttime定时器设置检测画面获取
self.detect_data_signal.connect(self.detectThread.get_base64)
self.detectThread.transmit_data.connect(self.get_detectdata)
self.detectThread.search_data.connect(self.get_search_data)
def get_search_data(self, data):
self.plainTextEdit.setPlainText(data)
# 创建线程完成检测
def create_thread(self):
self.detectThread = detect_thread(self.access_token, )
self.detectThread.start()
def get_cameradata(self):
# 摄像头获取画面
camera_data = self.cameravideo.read_camera()
# 把摄像头画面转换成图片,然后设置编码base64编码格式数据
_, enc = cv2.imencode('.jpg', camera_data)
base64_image = base64.b64encode(enc.tobytes())
# 产生信号,传递数据
self.detect_data_signal.emit(bytes(base64_image))
# 并处作为摄像头,获取数据,显示画面的功能
# 并只要能够不断重复调用这个函数,不断的从摄像头获取数据进行显示
# 可以通过信号, 信号关联当前函数。只要信号产生,函数就会被调用
# 信号需要不断的产生,可以通过定时器,定时时间到达就会产生信号
def show_cameradata(self):
# 获取摄像头数据,转换数据
pic = self.cameravideo.camera_to_pic()
# 显示数据,显示画面
self.label.setPixmap(pic)
# 获取进行网络请求的访问令牌
def get_accesstoken(self):
# host对象是字符串对象存储是授权的服务地址-----获取accesstoken的地址
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=exGfN5ZtUhTgZGHZVV8v821I&client_secret=iXyHXkgxqCwzDigifG5Bq9FQY4nCPDaS'
# 发送网络请求 requests网络库
# 使用get函数发送网络请求,参数为网络请求的地址,执行时会产生返回结果,结果就是请求的结果
response = requests.get(host)
if response:
# print(response.json())
data = response.json()
self.access_token = data.get('access_token')
# 槽函数,获取检测数据
def get_detectdata(self, data):
if data['error_code'] != 0:
self.plainTextEdit_2.setPlainText(data['error_msg'])
elif data['error_msg'] == 'SUCCESS':
# 在data字典中,键为'result'对应的值才是返回的检查结果
# data['result']才是检测结果
# 人脸数目
self.plainTextEdit_2.clear()
face_num = data['result']['face_num']
if face_num == 0:
self.plainTextEdit_2.appendPlainText("未测到检人脸")
return
else:
self.plainTextEdit_2.appendPlainText("测到检人脸")
# 人脸信息data['result']['face_list'],是列表,每个数据就是一个人脸信息,需要取出每个列表数据
# 每个人脸信息:data['result']['face_list'][0~i]人脸信息字典
for i in range(face_num):
# 通过for循环,分别取出列表的每一个数据
# data['result']['face_list'][i]
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
需求:能够实现管理学生人脸签到的系统 分析: 1、摄像头进行人脸检测 2、人脸识别判断 3、人脸库管理 4、人脸库添加、删除 5、数据库签到信息 6、导出签到数据 技术选型: python:作为开发语言 Pycharm:作为IDE进行开发 opencv:数字图形处理库(摄像头操作) sqlite3:签到数据存储 厂商提供成熟的人脸识别技术: 百度---提供的人脸识别 CNN卷积神经网络
资源推荐
资源详情
资源评论
收起资源包目录
基于人脸识别的课堂签到管理系统.zip (23个子文件)
mango
mainwindow.ui 6KB
adduser.ui 5KB
adduserwindow.py 2KB
adduser.py 5KB
cameravideo.py 2KB
2.jpg 215KB
mywindow.py 22KB
detect.py 4KB
main.py 344B
.idea
misc.xml 199B
workspace.xml 9KB
inspectionProfiles
profiles_settings.xml 174B
modules.xml 269B
.gitignore 50B
mango.iml 335B
__pycache__
detect.cpython-36.pyc 3KB
mywindow.cpython-36.pyc 10KB
cameravideo.cpython-36.pyc 1KB
adduserwindow.cpython-36.pyc 2KB
adduser.cpython-36.pyc 3KB
mainwindow.cpython-36.pyc 4KB
mainwindow.py 7KB
3.jpg 262KB
共 23 条
- 1
资源评论
- 好运爆棚2023-07-24这个文件的人脸识别功能让签到变得更加高效,学生们不再需要手动填写信息。
- IYA17382023-07-24这个文件提供了一个简单而有效的解决方案,可以帮助教师轻松管理课堂签到。
- 人亲卓玛2023-07-24这个文件的界面设计简洁明了,易于理解和操作,不需要专业的技术背景也能轻松上手。
- 洋葱庄2023-07-24使用这个文件进行签到,可以大大减少传统签到方式中出现的错误和漏签情况。
- 三更寒天2023-07-24如果你是一位需要频繁进行课堂签到的教师,这个文件将是一个非常实用的工具,能够节省你大量的时间和精力。
爱跑步的mango
- 粉丝: 1162
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功