# -*- coding: utf-8 -*-
import sys
import cv2
import threading
from PyQt5.QtCore import QBasicTimer
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QGridLayout, QMessageBox, QGroupBox
from PyQt5 import QtWidgets
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
from PIL import Image
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QPalette, QBrush, QPixmap
import os
import RPi.GPIO as GPIO
# 定义人脸标签和初始化标签对应的人物名称
id = 0
names = ['None', 'oneStar', 'denghaibo', 'zhangzhaohui', 'zhangchaoyang','guomo','yanjie','luochao','yanggong','gaogong']
# 导入GPIO
import RPi.GPIO as GPIO
# 设置GPIO模式,BCM模式在所有数码派通用
GPIO.setmode(GPIO.BCM)
# 设置GPIO25为电流输出
GPIO.setup(25, GPIO.OUT)
import time
import signal
import atexit
atexit.register(GPIO.cleanup)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT, initial=False)
p = GPIO.PWM(17,50) #50HZ
p.start(0)
# 导入OpenCV自带的数据集,定义多个是因为在后面有多次调用,用一个的话会报错
faceCascade = cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_default.xml')
faceCascade2 = cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_default.xml')
faceCascade3 = cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_default.xml')
# 继承QLineEdit,重写mouseReleaseEvent函数
class mylineedit(QLineEdit):
clicked = pyqtSignal() # 定义clicked信号
def mouseReleaseEvent(self, QMouseEvent):
if QMouseEvent.button() == Qt.LeftButton:
self.clicked.emit() # 发送clicked信号
# 创建主界面类
class Ui_Menu(QWidget):
def __init__(self):
super(Ui_Menu, self).__init__()
# 创建label并设置文本内容
self.label = QLabel('欢迎使用人脸识别门禁系统', self)
# 创建普通用户和管理员按键
self.btn_ordinary = QPushButton('普通用户', self)
self.btn_admin = QPushButton('管理员', self)
# 初始化界面
self.init_ui()
def init_ui(self):
# 设置窗口大小
self.resize(1280, 800)
# 设置label框的位置
self.label.move(140, 200)
# 设置按键框的位置和大小
self.btn_ordinary.setGeometry(550, 420, 181, 61)
self.btn_admin.setGeometry(550, 510, 181, 61)
# 设置label样式(字体、大小、颜色等)
self.label.setStyleSheet(
"QLabel{color:rgb(0,0,0,255);" # 字体颜色为黑色
"font-size:82px;font-weight:bold;" # 大小为70 加粗
"font-family:Roman times;}") # Roman times字体
self.btn_ordinary.setStyleSheet(
"QPushButton{color:rgb(0,0,0,255);" # 字体颜色为黑色
"font-size:30px;" # 大小为30
"font-family:Roman times;}") # Roman times字体
self.btn_admin.setStyleSheet(
"QPushButton{color:rgb(0,0,0,255);" # 字体颜色为黑色
"font-size:30px;" # 大小为30
"font-family:Roman times;}") # Roman times字体
# 点击管理员按钮事件
self.btn_admin.clicked.connect(self.slot_btn_admin)
# 点击普通用户按钮事件
self.btn_ordinary.clicked.connect(self.slot_btn_ordinary)
# 点点击管理员按钮事件
def slot_btn_admin(self):
self.logon = Ui_logon()
self.logon.show()
self.hide()
# 点击普通用户按钮事件
def slot_btn_ordinary(self):
self.face_reco = Ui_face_reco()
self.face_reco.show()
self.hide()
# 创建登录界面类
class Ui_logon(QWidget):
clicked = pyqtSignal()
def __init__(self):
super(Ui_logon, self).__init__()
# 初始化数值
self.ID_num = ""
self.key_num = ""
# 创建账号、密码以、输入框以及登录返回等按键
self.lab_ID = QLabel('账号', self)
self.lab_key = QLabel('密码', self)
self.Edit_ID = mylineedit(self)
self.Edit_key = mylineedit(self)
self.selected = self.Edit_ID # 输入位置标识位
self.btn_logon = QPushButton('登录', self)
self.btn_back = QPushButton('返回', self)
self.btn_1 = QPushButton('1', self)
self.btn_2 = QPushButton('2', self)
self.btn_3 = QPushButton('3', self)
self.btn_4 = QPushButton('4', self)
self.btn_5 = QPushButton('5', self)
self.btn_6 = QPushButton('6', self)
self.btn_7 = QPushButton('7', self)
self.btn_8 = QPushButton('8', self)
self.btn_9 = QPushButton('9', self)
self.btn_0 = QPushButton('0', self)
self.btn_del = QPushButton('del', self)
# 设置容器存放数字键,使用栅格布局
self.layoutWidget = QWidget(self)
self.gridLayout = QGridLayout(self.layoutWidget)
# 点击mylineedit事件
self.Edit_ID.clicked.connect(self.changeEdit_ID)
self.Edit_key.clicked.connect(self.changeEdit_key)
# 初始化界面
self.init_ui()
# 点击Edit_ID事件
def changeEdit_ID(self):
self.selected = self.Edit_ID
# 点击Edit_key事件
def changeEdit_key(self):
self.selected = self.Edit_key
# 初始化界面
def init_ui(self):
# 设置窗口大小
self.resize(1280, 800)
# 设置lab_ID位置
self.lab_ID.setGeometry(380, 130, 71, 41)
self.lab_key.setGeometry(380, 200, 71, 41)
self.Edit_ID.setGeometry(470, 130, 411, 41)
self.Edit_key.setGeometry(470, 200, 411, 41)
self.btn_logon.setGeometry(490, 270, 91, 51)
self.btn_back.setGeometry(690, 270, 91, 51)
# 设置数字键高度
self.btn_0.setFixedHeight(50)
self.btn_1.setFixedHeight(50)
self.btn_2.setFixedHeight(50)
self.btn_3.setFixedHeight(50)
self.btn_4.setFixedHeight(50)
self.btn_5.setFixedHeight(50)
self.btn_6.setFixedHeight(50)
self.btn_7.setFixedHeight(50)
self.btn_8.setFixedHeight(50)
self.btn_9.setFixedHeight(50)
self.btn_del.setFixedHeight(50)
# 设置容器位置
# self.layoutWidget.setGeometry(230, 320, 806, 61)
self.layoutWidget.setGeometry(491, 404, 291, 251)
# 将数字存放进容器
self.gridLayout.addWidget(self.btn_1, 0, 0, 1, 1)
self.gridLayout.addWidget(self.btn_2, 0, 1, 1, 1)
self.gridLayout.addWidget(self.btn_3, 0, 2, 1, 1)
self.gridLayout.addWidget(self.btn_4, 1, 0, 1, 1)
self.gridLayout.addWidget(self.btn_5, 1, 1, 1, 1)
self.gridLayout.addWidget(self.btn_6, 1, 2, 1, 1)
self.gridLayout.addWidget(self.btn_7, 2, 0, 1, 1)
self.gridLayout.addWidget(self.btn_8, 2, 1, 1, 1)
self.gridLayout.addWidget(self.btn_9, 2, 2, 1, 1)
self.gridLayout.addWidget(self.btn_0, 3, 0, 1, 1)
self.gridLayout.addWidget(self.btn_del, 3, 1, 1, 2)
# 对lab_ID字体大小进行设置
self.lab_ID.setStyleSheet(
"QLabel{color:rgb(0,0,0,255);" # 字体颜色为黑色
"font-size:30px;" # 大小为30
"font-family:Roman times;}") # Roman times字体
# 对lab_key字体大小进行设置
self.lab_key.setStyleSheet(
"QLabel{color:rgb(0,0,0,255);" # 字体颜色为黑色
"font-size:30px;" # 大小为30
"font-family:Roman times;}") # Roman times字体
# 对Edit_ID字体大小进行设置
self.Edit_ID.setStyleSheet(
"QLineEdit{color:rgb(0,0,0,255);" # 字体颜色为黑色