在学校中因为上课原因,没有拿到关于电气及其自动化本专业的毕业题目,但是门禁系统让我眼前一亮。此题目是我硬着头皮接下的。
为了更好的做完自己的毕业设计,在不断的学习python的知识,并运用mysql建立起了一定的链接。
此设计分为两个方面,一个是后台管理系统,这个是用于人员信息的输入。此用学号作为ID,并输入班级姓名和人脸照片,这方面我是用python中的Django框架进行设计的。
另一个是人脸识别系统,此系统是通过linux作为核心原件,Ubuntu作为系统设计的。
下面展示的是人脸识别系统,至于后台管理系统看时间情况吧。
import base64
import threading
from numpy import *
import cv2
import pymysql
import time
import RPi.GPIO as GPIO
import pyttsx3
from aip import AipFace
cap = cv2.VideoCapture(0)
# 活体检测
# 活体检测的级别NONE LOW NORMSL HIGH
options = {
}
options["liveness_control"] = "LOW"
GROUP = 'face'
e_close = False
# 录像函数
def void():
while True:
global cv2, img, e_close
win_name = 'read'
# 调用摄像头
sucess, img = cap.read()
cv2.namedWindow(win_name, 0)
cv2.resizeWindow(win_name, 500,300)
# 图像展示
cv2.imshow(win_name, img)
# 保持图像
k = cv2.waitKey(1)
# 退出函数
if k == 27:
e_close = True
cap.release()
cv2.destroyAllWindows()
break
# 人脸检测主体函数
def getImg():
while True:
# 线程互锁
if e_close:
return
# 延迟
time.sleep(2)
# 调用识别函数并返回结果
result = Picture_Processing()
# 判断是否成功
if result['error_msg'] == 'SUCCESS':
# 获取成功后的信息
bstu_id = result['result']['user_list'][0]['user_id']
# 获取分数
score = result['result']['user_list'][0]['score']
if score > 80: # 大于80成立
# 数据库调取信息
bstu_id, bstu_name, bstu_class = mysql_select(bstu_id)
# 控制树莓派引脚函数
yinjiao()
# 播报函数
sound(bstu_name)
# 进门时间录入函数
W_door_in(bstu_id, bstu_name, bstu_class)
else:
print("未识别")
# 引脚函数
def yinjiao():
# 设置调用引脚的模式
GPIO.setmode(GPIO.BOARD)
# 设置输出引脚
GPIO.setup(11, GPIO.OUT)
# 输出引脚设为高电平
GPIO.output(11, GPIO.HIGH)
time.sleep(5)
# 5秒延时后低电平
GPIO.output(11, GPIO.LOW)
time.sleep(3)
def W_Mysql_door(bstu_id, bstu_name, bstu_class, in_datatime):
conn = mysql_connection()
cur = conn.cursor()
sql = "INSERT INTO door_in (bstu_id,bstu_name,bstu_class, bin_door) values (%s,%s,%s,%s)"
cur.execute(sql, (bstu_id, bstu_name, bstu_class, in_datatime))
conn.commit()
cur.close()
conn.close()
def W_door_in(bstu_id, bstu_name, bstu_class):
# 获取当地时间
in_datatime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 调用sql
W_Mysql_door(bstu_id, bstu_name, bstu_class, in_datatime)
# 进门人员播报
def sound(sound_name):
# 初始化
engine = pyttsx3.init()
# 读取中文
engine.setProperty('voice', 'zh')
# 设置播报的语句
engine.say("欢迎" + sound_name + '进入')
# 等待播报完毕
engine.runAndWait()
def mysql_select(bstu_id):
conn = mysql_connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
sql = 'select * from face_stu where bstu_id = %s'
cursor.execute(sql, bstu_id)
sul = cursor.fetchone()
cursor.close()
conn.close()
print(sul["bstu_id"], sul["bstu_name"], sul["bstu_class"])
return sul["bstu_id"], sul["bstu_name"], sul["bstu_class"]
# 设置数据库的初始
def mysql_connection():
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123456',
database='face_door',
charset='utf8'
)
return conn
def Picture_Processing():
# 获取照片并保存在1.jpg中
cv2.imwrite("1.jpg", img)
# 百度的apiID之类的
APP_ID = ''#需自己注册
API_KEY = ''#需自己注册
SECRET_KEY = ''#需自己注册
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
# 设置转换格式
IMAGE_TYPE = 'BASE64'
with open('1.jpg', 'rb') as f:
# 转换格式
baidu_base64 = base64.b64encode(f.read())
# 发送给百度api
result = client.search(str(baidu_base64, 'utf-8'), IMAGE_TYPE, GROUP, options)
# 销毁图像
with open('1.jpg', 'w') as a:
a.write("1111")
return result
# 线程问题
def thread():
t1 = threading.Thread(target=void)
t2 = threading.Thread(target=getImg)
t1.start()
t2.start()
if __name__ == '__main__':
thread()
求打赏求点赞求关注