基于树莓派百度Api的人脸门禁系统--毕业设计

基于树莓派百度Api的人脸门禁系统

在学校中因为上课原因,没有拿到关于电气及其自动化本专业的毕业题目,但是门禁系统让我眼前一亮。此题目是我硬着头皮接下的。

为了更好的做完自己的毕业设计,在不断的学习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()


求打赏求点赞求关注

你可能感兴趣的:(linux,mysql,人脸识别,python,计算机视觉,多线程)