当前位置:   article > 正文

基于python的人脸识别门禁系统_python人脸识别门禁系统

python人脸识别门禁系统

人脸识别门禁系统是一种基于人脸识别技术的安全系统。在Python中,可以使用多种人脸识别库(如OpenCV和dlib)来实现这种门禁系统。以下是一个基于Python的人脸识别门禁系统的需求分析:

1. 用户注册系统:门禁系统需要一个用户注册系统,让用户在系统中注册账户并上传自己的照片。这些照片将用于后续的人脸识别。

2. 人脸检测系统:门禁系统需要一个人脸检测系统,以检测进入门禁区域的人脸。这个检测系统需要使用Python中的人脸识别库,例如OpenCV或dlib。

3. 人脸识别系统:门禁系统需要一个人脸识别系统,以识别进入门禁区域的人员是否在注册用户列表中。这个识别系统需要使用Python中的人脸识别库,例如OpenCV或dlib。

4. 数据库管理系统:门禁系统需要一个数据库管理系统,以存储注册用户列表和门禁记录。这个管理系统可以使用Python中的SQLite或MySQL等关系型数据库。

5. 记录管理系统:门禁系统需要一个记录管理系统,以记录进出门禁区域的人员信息,包括时间戳、人员姓名、进出状态等。这个管理系统可以使用Python中的日志模块或数据库管理系统中的表格来实现。

6. 报警系统:门禁系统需要一个报警系统,以在检测到未注册用户或异常情况时发出警报。这个报警系统可以使用Python中的声音或图像提示,或者将警报信息发送到管理员的手机或电子邮件中。

7. 界面设计系统:门禁系统需要一个友好的界面设计系统,以便管理员或用户能够方便地使用门禁系统。这个设计系统可以使用Python中的Tkinter或PyQt等界面库来实现。

基于上述需求分析,我们可以进行以下详细设计:

1. 用户注册系统:

用户注册系统需要实现以下功能:

    a. 允许用户在系统中注册账户,并上传自己的照片。
    b. 保存用户的注册信息和照片到数据库中。
    c. 支持用户查看和修改自己的注册信息和照片。

实现方法:

    a. 可以使用Python中的图形用户界面库,如Tkinter、PyQt等,设计一个注册界面,让用户输入自己的姓名、性别、年龄、联系方式等信息,并上传自己的照片。
    b. 将用户的注册信息和照片保存到数据库中,可以使用Python中的关系型数据库MySQL或SQLite。
    c. 允许用户通过界面或API访问自己的注册信息和照片,并支持用户修改自己的信息和照片。

2. 人脸检测系统:

人脸检测系统需要实现以下功能:

    a. 检测门禁区域进入的人脸。
    b. 在检测到人脸后,将人脸图像传递给人脸识别系统进行识别。

实现方法:

    a. 可以使用Python中的OpenCV或dlib等人脸识别库来实现人脸检测功能。
    b. 将检测到的人脸图像传递给人脸识别系统进行识别。

3. 人脸识别系统:

人脸识别系统需要实现以下功能:

    a. 从数据库中读取已注册用户的信息和照片。
    b. 对进入门禁区域的人脸进行识别,判断是否为已注册用户。
    c. 如果是已注册用户,记录进出门禁区域的时间和状态,保存到数据库中。

实现方法:

    a. 从数据库中读取已注册用户的信息和照片。
    b. 使用Python中的人脸识别库,如OpenCV或dlib,对进入门禁区域的人脸进行识别,并判断是否为已注册用户。
    c. 如果是已注册用户,记录进出门禁区域的时间和状态,并保存到数据库中。

4. 数据库管理系统:

数据库管理系统需要实现以下功能:

    a. 管理已注册用户的信息和照片。
    b. 管理门禁记录,包括人员姓名、进出时间和状态等。

实现方法:

    a. 可以使用Python中的关系型数据库MySQL或SQLite来管理已注册用户的信息和照片。
    b. 在门禁记录中,使用数据库管理系统中的表格来存储人员姓名、进出时间和状态等信息。

5. 记录管理系统:

记录管理系统需要实现以下功能:

    a. 记录进出门禁区域的人员信息,包括时间戳、人员姓名、进出状态等。
    b. 支持管理员查看和导出门禁记录。

实现方法:

    a. 在人脸识别系统中记录进出门禁区域的人员信息,包括时间戳、人员姓名、进出状态等,并保存到数据库中。
    b. 支持管理员通过界面或API访问门禁记录,并支持管理员导出门禁记录。

6. 报警系统:

报警系统需要实现以下功能:

    a. 在检测到未注册用户或异常情况时发出警报。
    b. 将警报信息发送到管理员的手机或电子邮件中。

实现方法:

    a. 在人脸检测和识别系统中检测未注册用户或异常情况,并在检测到时发出警报。
    b. 将警报信息通过Python中的手机短信或电子邮件模块发送给管理员。

7. 界面设计系统:

界面设计系统需要实现以下功能:

    a. 提供一个友好的用户界面,方便管理员或用户使用门禁系统。
    b. 支持用户注册、查看、修改自己的信息和照片。
    c. 支持管理员查看门禁记录和导出记录。

实现方法:

    a. 可以使用Python中的图形用户界面库,如Tkinter、PyQt等,设计一个友好的用户界面。
    b. 提供用户注册、查看、修改自己的信息和照片的功能。
    c. 提供管理员查看门禁记录和导出记录的功能,并支持管理员对记录进行筛选和搜索。

以下是一个基于Python的用户注册系统的示例代码,使用了Tkinter作为图形用户界面库,SQLite作为关系型数据库。这个系统实现了用户注册、查看、修改和删除自己的信息和照片等功能。

  1. import tkinter as tk
  2. from tkinter import filedialog
  3. import sqlite3
  4. # 创建用户注册系统的主界面
  5. class UserRegistrationSystem(tk.Frame):
  6. def __init__(self, master=None):
  7. super().__init__(master)
  8. self.master = master
  9. self.master.title("用户注册系统")
  10. self.pack()
  11. # 创建用户信息输入框
  12. self.create_input()
  13. # 创建用户照片上传按钮
  14. self.create_upload_button()
  15. # 创建注册和删除按钮
  16. self.create_register_button()
  17. self.create_delete_button()
  18. # 创建用户信息显示框
  19. self.create_text()
  20. # 连接数据库
  21. self.conn = sqlite3.connect('user.db')
  22. self.cursor = self.conn.cursor()
  23. self.create_table()
  24. # 创建用户信息输入框
  25. def create_input(self):
  26. self.name_label = tk.Label(self, text="姓名:")
  27. self.name_label.grid(row=0, column=0)
  28. self.name_entry = tk.Entry(self)
  29. self.name_entry.grid(row=0, column=1)
  30. self.gender_label = tk.Label(self, text="性别:")
  31. self.gender_label.grid(row=1, column=0)
  32. self.gender_entry = tk.Entry(self)
  33. self.gender_entry.grid(row=1, column=1)
  34. self.age_label = tk.Label(self, text="年龄:")
  35. self.age_label.grid(row=2, column=0)
  36. self.age_entry = tk.Entry(self)
  37. self.age_entry.grid(row=2, column=1)
  38. self.phone_label = tk.Label(self, text="联系方式:")
  39. self.phone_label.grid(row=3, column=0)
  40. self.phone_entry = tk.Entry(self)
  41. self.phone_entry.grid(row=3, column=1)
  42. # 创建用户照片上传按钮
  43. def create_upload_button(self):
  44. self.upload_button = tk.Button(self, text="上传照片", command=self.upload_photo)
  45. self.upload_button.grid(row=4, column=0)
  46. # 创建注册按钮
  47. def create_register_button(self):
  48. self.register_button = tk.Button(self, text="注册", command=self.register_user)
  49. self.register_button.grid(row=4, column=1)
  50. # 创建删除按钮
  51. def create_delete_button(self):
  52. self.delete_button = tk.Button(self, text="删除", command=self.delete_user)
  53. self.delete_button.grid(row=4, column=2)
  54. # 创建用户信息显示框
  55. def create_text(self):
  56. self.text = tk.Text(self, width=30, height=10)
  57. self.text.grid(row=5, columnspan=3)
  58. # 上传用户照片
  59. def upload_photo(self):
  60. # 打开文件对话框
  61. filename = filedialog.askopenfilename(initialdir="/", title="选择照片",
  62. filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*")))
  63. self.photo_path = filename
  64. # 注册用户
  65. def register_user(self):
  66. name = self.name_entry.get()
  67. gender = self.gender_entry.get()
  68. age = self.age_entry.get()
  69. phone = self.phone_entry.get()
  70. # 将用户信息存入数据库
  71. if name and gender and age and phone and self.photo_path:
  72. with open(self.photo_path, 'rb') as f:
  73. photo = f.read()
  74. self.cursor.execute("INSERT INTO user (name, gender, age, phone, photo) VALUES (?, ?, ?, ?, ?)",
  75. (name, gender, age, phone, photo))
  76. self.conn.commit()
  77. self.show_message("注册成功!")
  78. else:
  79. self.show_message("请填写所有信息并上传照片!")
  80. # 删除用户
  81. def delete_user(self):
  82. name = self.name_entry.get()
  83. # 从数据库中删除用户信息
  84. if name:
  85. self.cursor.execute("DELETE FROM user WHERE name=?", (name,))
  86. self.conn.commit()
  87. self.show_message("删除成功!")
  88. else:
  89. self.show_message("请输入姓名!")
  90. # 显示用户信息
  91. def show_message(self, message):
  92. self.text.delete('1.0', tk.END)
  93. self.text.insert('1.0', message)
  94. # 创建用户信息表格
  95. def create_table(self):
  96. self.cursor.execute('''CREATE TABLE IF NOT EXISTS user
  97. (id INTEGER PRIMARY KEY AUTOINCREMENT,
  98. name TEXT NOT NULL,
  99. gender TEXT NOT NULL,
  100. age INTEGER NOT NULL,
  101. phone TEXT NOT NULL , photo BLOB NOT NULL)''')
  102. # 查询用户信息
  103. def query_user(self, name):
  104. self.cursor.execute("SELECT * FROM user WHERE name=?", (name,))
  105. result = self.cursor.fetchone()
  106. return result
  107. # 更新用户信息
  108. def update_user(self, name, gender, age, phone, photo_path):
  109. with open(photo_path, 'rb') as f:
  110. photo = f.read()
  111. self.cursor.execute("UPDATE user SET gender=?, age=?, phone=?, photo=? WHERE name=?",
  112. (gender, age, phone, photo, name))
  113. self.conn.commit()
  114. self.show_message("更新成功!")
  115. # 显示用户信息
  116. def show_user(self, name):
  117. result = self.query_user(name)
  118. if result:
  119. self.show_message("姓名:{}\n性别:{}\n年龄:{}\n联系方式:{}".format(result[1], result[2], result[3], result[4]))
  120. with open('photo.jpg', 'wb') as f:
  121. f.write(result[5])
  122. img = tk.PhotoImage(file='photo.jpg')
  123. label = tk.Label(self, image=img)
  124. label.grid(row=6, columnspan=3)
  125. label.image = img
  126. else:
  127. self.show_message("用户不存在!")
  128. # 运行用户注册系统
  129. if __name__ == "__main__":
  130. root = tk.Tk()
  131. app = UserRegistrationSystem(master=root)
  132. app.mainloop()

一个基本的用户注册系统,允许用户输入姓名、性别、年龄、联系方式等信息,并上传自己的照片。用户注册信息和照片会被保存到SQLite数据库中,用户可以通过界面或API访问自己的注册信息和照片,并支持用户修改自己的信息和照片。这个示例代码还可以进一步扩展,增加更多的功能和优化用户体验。

以下是使用OpenCV实现人脸检测系统的代码示例:

  1. import cv2
  2. # 加载人脸检测器
  3. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  4. # 加载人脸识别器
  5. recognizer = cv2.face.LBPHFaceRecognizer_create()
  6. # 加载训练好的人脸识别模型
  7. recognizer.read('trained_model.yml')
  8. # 打开摄像头
  9. cap = cv2.VideoCapture(0)
  10. while True:
  11. # 读取摄像头画面
  12. ret, frame = cap.read()
  13. # 将画面转换为灰度图像
  14. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  15. # 检测人脸
  16. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  17. # 处理每一个检测到的人脸
  18. for (x, y, w, h) in faces:
  19. # 在检测到的人脸周围画一个矩形框
  20. cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
  21. # 提取人脸图像
  22. face_roi_gray = gray[y:y+h, x:x+w]
  23. face_roi_color = frame[y:y+h, x:x+w]
  24. # 将人脸图像传递给人脸识别器进行识别
  25. label, confidence = recognizer.predict(face_roi_gray)
  26. # 将识别结果显示在画面上
  27. if confidence < 100:
  28. text = 'Person ' + str(label)
  29. else:
  30. text = 'Unknown'
  31. cv2.putText(frame, text, (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
  32. # 显示处理后的画面
  33. cv2.imshow('Face Detection', frame)
  34. # 按下q键退出程序
  35. if cv2.waitKey(1) & 0xFF == ord('q'):
  36. break
  37. # 释放摄像头资源
  38. cap.release()
  39. # 关闭所有窗口
  40. cv2.destroyAllWindows()


 

在上述代码中,我们首先加载了人脸检测器和人脸识别器,然后打开摄像头开始读取画面。对于每一帧画面,我们先将其转换为灰度图像,然后使用人脸检测器检测其中的人脸。对于每一个检测到的人脸,我们在其周围画一个矩形框,并提取出人脸图像。然后将人脸图像传递给人脸识别器进行识别,并将识别结果显示在画面上。最后,我们通过按下q键来退出程序。

以下是一个基于OpenCV库的人脸识别系统,实现了从数据库中读取已注册用户的信息和照片,对进入门禁区域的人脸进行识别,并判断是否为已注册用户,如果是已注册用户则记录进出门禁区域的时间和状态,并保存到数据库中。

一个基本的示例代码,实际应用中还需要根据具体需求进行修改和完善。
 

  1. import cv2
  2. import numpy as np
  3. import sqlite3
  4. import datetime
  5. # 连接数据库
  6. conn = sqlite3.connect('users.db')
  7. c = conn.cursor()
  8. # 加载人脸识别器
  9. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  10. recognizer = cv2.face.LBPHFaceRecognizer_create()
  11. # 加载已注册用户的信息和照片
  12. c.execute('SELECT * FROM users')
  13. users = c.fetchall()
  14. labels = []
  15. faces = []
  16. for user in users:
  17. labels.append(user[0])
  18. img = cv2.imread(user[1])
  19. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  20. faces.append(gray)
  21. # 训练人脸识别器
  22. recognizer.train(faces, np.array(labels))
  23. # 打开摄像头
  24. cap = cv2.VideoCapture(0)
  25. while True:
  26. # 读取摄像头画面
  27. ret, frame = cap.read()
  28. # 将画面转换为灰度图像
  29. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  30. # 检测人脸
  31. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  32. # 处理每一个检测到的人脸
  33. for (x, y, w, h) in faces:
  34. # 在检测到的人脸周围画一个矩形框
  35. cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
  36. # 提取人脸图像
  37. face_roi_gray = gray[y:y+h, x:x+w]
  38. face_roi_color = frame[y:y+h, x:x+w]
  39. # 将人脸图像传递给人脸识别器进行识别
  40. label, confidence = recognizer.predict(face_roi_gray)
  41. # 将识别结果显示在画面上
  42. if confidence < 100:
  43. # 如果是已注册用户,记录进出门禁区域的时间和状态,并保存到数据库中
  44. user_data = c.execute("SELECT * FROM users WHERE id=?", (label,))
  45. user = user_data.fetchone()
  46. status = 'in' # 判断进出门禁区域的状态,这里假设所有用户初始状态都是进入门禁区域
  47. now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 获取当前时间
  48. c.execute("INSERT INTO records (user_id, status, time) VALUES (?, ?, ?)", (user[0], status, now))
  49. conn.commit()
  50. text = 'Person ' + str(user[0])
  51. else:
  52. text = 'Unknown'
  53. cv2.putText(frame, text, (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
  54. # 显示处理后的画面
  55. cv2.imshow('Face Recognition', frame)
  56. # 按下q键退出程序
  57. if cv2.waitKey(1) & 0xFF == ord('q'):
  58. break
  59. # 释放摄像头资源
  60. cap.release()
  61. # 关闭所有窗口
  62. cv2.destroyAllWindows()
  63. # 关闭数据库连接
  64. conn.close()

简单的记录管理系统的示例代码,使用Python编写,实现了记录进出门禁区域的人员信息,包括时间戳、人员姓名、进出状态等,并保存到数据库中;支持管理员通过界面或API访问门禁记录,并支持管理员导出门禁记录。

实际应用中还需要根据具体需求进行修改和完善。
 

  1. import sqlite3
  2. from flask import Flask, jsonify, request, send_file
  3. import pandas as pd
  4. # 连接数据库
  5. conn = sqlite3.connect('records.db')
  6. c = conn.cursor()
  7. # 创建表格
  8. c.execute('''CREATE TABLE IF NOT EXISTS records
  9. (id INTEGER PRIMARY KEY AUTOINCREMENT,
  10. user_id INTEGER,
  11. status TEXT,
  12. time TEXT)''')
  13. # 创建Flask应用
  14. app = Flask(__name__)
  15. # 添加门禁记录
  16. @app.route('/add_record', methods=['POST'])
  17. def add_record():
  18. user_id = request.form['user_id']
  19. status = request.form['status']
  20. time = request.form['time']
  21. c.execute("INSERT INTO records (user_id, status, time) VALUES (?, ?, ?)", (user_id, status, time))
  22. conn.commit()
  23. return jsonify({'result': 'success'})
  24. # 获取门禁记录
  25. @app.route('/get_records', methods=['GET'])
  26. def get_records():
  27. query = "SELECT records.id, users.name, records.status, records.time FROM records LEFT JOIN users ON records.user_id=users.id"
  28. records = c.execute(query).fetchall()
  29. # 将记录转换为JSON格式
  30. result = []
  31. for record in records:
  32. result.append({
  33. 'id': record[0],
  34. 'name': record[1],
  35. 'status': record[2],
  36. 'time': record[3]
  37. })
  38. return jsonify(result)
  39. # 导出门禁记录
  40. @app.route('/export_records', methods=['GET'])
  41. def export_records():
  42. query = "SELECT records.id, users.name, records.status, records.time FROM records LEFT JOIN users ON records.user_id=users.id"
  43. records = c.execute(query).fetchall()
  44. # 将记录转换为Pandas DataFrame
  45. df = pd.DataFrame(records, columns=['id', 'name', 'status', 'time'])
  46. # 将DataFrame导出为CSV文件
  47. csv_file = 'records.csv'
  48. df.to_csv(csv_file, index=False)
  49. # 返回CSV文件
  50. return send_file(csv_file, as_attachment=True)
  51. if __name__ == '__main__':
  52. app.run(debug=True)
  53. # 关闭数据库连接
  54. conn.close()

在这个代码中,我们使用了Flask框架来实现一个简单的REST API。我们定义了三个路由:

1. `/add_record`:用于添加门禁记录。通过HTTP POST请求,向该路由传递用户ID、进出状态和时间戳,然后将这些信息插入到数据库中。

2. `/get_records`:用于获取门禁记录。通过HTTP GET请求,访问该路由,然后从数据库中获取所有门禁记录,并将其转换为JSON格式返回给客户端。

3. `/export_records`:用于导出门禁记录。通过HTTP GET请求,访问该路由,然后从数据库中获取所有门禁记录,并将其转换为CSV格式,并将CSV文件作为附件返回给客户端。

在实际应用中,我们需要进行更多的安全性和错误处理,这里只是为了演示基本的功能。

以下是一个基于人脸识别的报警系统的示例代码,使用Python编写,实现了在检测到未注册用户或异常情况时发出警报,并将警报信息发送到管理员的手机或电子邮件中。

请注意,这只是一个基本的示例代码,实际应用中还需要根据具体需求进行修改和完善。```python
 

  1. import cv2
  2. import numpy as np
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart
  6. from email.mime.image import MIMEImage
  7. from twilio.rest import Client
  8. # 加载人脸识别器
  9. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  10. recognizer = cv2.face.LBPHFaceRecognizer_create()
  11. # 加载已注册用户的信息和照片
  12. labels = []
  13. faces = []
  14. with open('users.txt', 'r') as f:
  15. for line in f:
  16. parts = line.strip().split(',')
  17. labels.append(int(parts[0]))
  18. img = cv2.imread(parts[1])
  19. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  20. faces.append(gray)
  21. # 训练人脸识别器
  22. recognizer.train(faces, np.array(labels))
  23. # Twilio账户信息(用于发送短信)
  24. account_sid = 'your_account_sid'
  25. auth_token = 'your_auth_token'
  26. client = Client(account_sid, auth_token)
  27. # 邮件账户信息(用于发送邮件)
  28. email_address = 'your_email_address'
  29. email_password = 'your_email_password'
  30. smtp_server = 'your_smtp_server'
  31. # 发送短信
  32. def send_sms(to_number, message):
  33. client.messages.create(
  34. body=message,
  35. from_='+15017122661',
  36. to=to_number
  37. )
  38. # 发送邮件
  39. def send_email(to_address, subject, message, image_file):
  40. msg = MIMEMultipart()
  41. msg['From'] = email_address
  42. msg['To'] = to_address
  43. msg['Subject'] = subject
  44. text = MIMEText(message)
  45. msg.attach(text)
  46. with open(image_file, 'rb') as f:
  47. img_data = f.read()
  48. image = MIMEImage(img_data, name='image.jpg')
  49. msg.attach(image)
  50. with smtplib.SMTP(smtp_server, 587) as smtp:
  51. smtp.starttls()
  52. smtp.login(email_address, email_password)
  53. smtp.send_message(msg)
  54. # 打开摄像头
  55. cap = cv2.VideoCapture(0)
  56. while True:
  57. # 读取摄像头画面
  58. ret, frame = cap.read()
  59. # 将画面转换为灰度图像
  60. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  61. # 检测人脸
  62. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  63. # 处理每一个检测到的人脸
  64. for (x, y, w, h) in faces:
  65. # 在检测到的人脸周围画一个矩形框
  66. cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
  67. # 提取人脸图像
  68. face_roi_gray = gray[y:y+h, x:x+w]
  69. face_roi_color = frame[y:y+h, x:x+w]
  70. # 将人脸图像传递给人脸识别器进行识别
  71. label, confidence = recognizer.predict(face_roi_gray)
  72. # 如果识别的置信度低于阈值,则认为是未注册用户,发出警报
  73. if confidence > 70:
  74. message = 'Unknown person detected!'
  75. send_sms('+1234567890', message)
  76. send_email('admin@example.com', 'Alert', message, 'image.jpg')
  77. cv2.putText(frame, 'Unknown', (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
  78. # 显示处理后的画面
  79. cv2.imshow('Face Recognition', frame)
  80. # 按下q键退出程序
  81. if cv2.waitKey(1) & 0xFF == ord('q'):
  82. break
  83. # 释放摄像头资源
  84. cap.release()
  85. # 关闭所有窗口
  86. cv2.destroyAllWindows()

以下是一个使用Tkinter库实现的简单界面设计系统的示例代码,使用Python编写,实现了提供一个友好的用户界面,方便管理员或用户使用门禁系统;支持用户注册、查看、修改自己的信息和照片;支持管理员查看门禁记录和导出记录,并支持管理员对记录进行筛选和搜索。

请注意,这只是一个基本的示例代码,实际应用中还需要根据具体需求进行修改和完善。```python
 

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import sqlite3
  4. from tkinter.filedialog import askopenfilename
  5. import pandas as pd
  6. # 连接数据库
  7. conn = sqlite3.connect('records.db')
  8. c = conn.cursor()
  9. # 创建表格
  10. c.execute('''CREATE TABLE IF NOT EXISTS users
  11. (id INTEGER PRIMARY KEY AUTOINCREMENT,
  12. name TEXT,
  13. email TEXT,
  14. phone TEXT,
  15. image TEXT)''')
  16. # 创建表格
  17. c.execute('''CREATE TABLE IF NOT EXISTS records
  18. (id INTEGER PRIMARY KEY AUTOINCREMENT,
  19. user_id INTEGER,
  20. status TEXT,
  21. time TEXT)''')
  22. # 创建主窗口
  23. root = tk.Tk()
  24. root.title("Door Access System")
  25. # 创建Notebook
  26. notebook = ttk.Notebook(root)
  27. notebook.pack()
  28. # 创建用户注册页面
  29. register_frame = ttk.Frame(notebook)
  30. notebook.add(register_frame, text='Register')
  31. # 创建用户信息显示页面
  32. info_frame = ttk.Frame(notebook)
  33. notebook.add(info_frame, text='My Info')
  34. # 创建管理员页面
  35. admin_frame = ttk.Frame(notebook)
  36. notebook.add(admin_frame, text='Admin')
  37. # 用户注册页面
  38. def register():
  39. name = name_entry.get()
  40. email = email_entry.get()
  41. phone = phone_entry.get()
  42. image = image_path.get()
  43. # 将用户信息插入到数据库中
  44. c.execute("INSERT INTO users (name, email, phone, image) VALUES (?, ?, ?, ?)", (name, email, phone, image))
  45. conn.commit()
  46. # 清空表单
  47. name_entry.delete(0, tk.END)
  48. email_entry.delete(0, tk.END)
  49. phone_entry.delete(0, tk.END)
  50. image_path.set('')
  51. # 显示成功消息
  52. success_label.configure(text='Registration successful!')
  53. # 创建用户注册表单
  54. name_label = ttk.Label(register_frame, text='Name:')
  55. name_label.grid(column=0, row=0, padx=10, pady=10)
  56. name_entry = ttk.Entry(register_frame, width=30)
  57. name_entry.grid(column=1, row=0, padx=10, pady=10)
  58. email_label = ttk.Label(register_frame, text='Email:')
  59. email_label.grid(column=0, row=1, padx=10, pady=10)
  60. email_entry = ttk.Entry(register_frame, width=30)
  61. email_entry.grid(column=1, row=1, padx=10, pady=10)
  62. phone_label = ttk.Label(register_frame, text='Phone:')
  63. phone_label.grid(column=0, row=2, padx=10, pady=10)
  64. phone_entry = ttk.Entry(register_frame, width=30)
  65. phone_entry.grid(column=1, row=2, padx=10, pady=10)
  66. image_label = ttk.Label(register_frame, text='Image:')
  67. image_label.grid(column=0, row=3, padx=10, pady=10)
  68. image_path = tk.StringVar()
  69. def select_image():
  70. filename = askopenfilename()
  71. image_path.set(filename)
  72. select_button = ttk.Button(register_frame, text='Select', command=select_image)
  73. select_button.grid(column=1, row=3, padx=10, pady=10)
  74. register_button = ttk.Button(register_frame, text='Register', command=register)
  75. register_button.grid(column=1, row=4, padx=10, pady=10)
  76. success_label = ttk.Label(register_frame, foreground='green')
  77. success_label.grid(column=1, row=5, padx=10, pady=10)
  78. # 用户信息显示页面
  79. def show_info():
  80. user_id = info_id_entry.get()
  81. query = "SELECT * FROM users WHERE id=?"
  82. user = c.execute(query, (user_id,)).fetchone()
  83. if user is not None:
  84. name_entry.configure(state='normal')
  85. email_entry.configure(state='normal')
  86. phone_entry.configure(state='normal')
  87. image_button.configure(state='normal')
  88. name_entry.delete(0, tk.END)
  89. email_entry.delete(0, tk.END)
  90. phone_entry.delete(0, tk.END)
  91. name_entry.insert(0, user[1])
  92. email_entry.insert(0, user[2])
  93. phone_entry.insert(0, user[3])
  94. image_path.set(user[4])
  95. image_button.configure(text='View Image', command=lambda: view_image(user[4]))
  96. else:
  97. name_entry.configure(state='disabled')
  98. email_entry.configure(state='disabled')
  99. phone_entry.configure(state='disabled')
  100. image_button.configure(state='disabled')
  101. image_path.set('')
  102. info_image.configure(image='')
  103. name_entry.grid(column=1, row=0, padx=10, pady=10)
  104. email_entry.grid(column=1, row=1, padx=10, pady=10)
  105. phone_entry.grid(column=1, row=2, padx=10, pady=10)
  106. image_button.grid(column=1, row=3, padx=10, pady=10)
  107. info_image.grid(column=2, row=0, rowspan=4, padx=10, pady=10)
  108. def view_image(image_file):
  109. img = tk.PhotoImage(file=image_file)
  110. info_image.configure(image=img)
  111. info_image.image = img
  112. info_id_label = ttk.Label(info_frame, text='User ID:')
  113. info_id_label.grid(column=0, row=0, padx=10, pady=10)
  114. info_id_entry = ttk.Entry(info_frame, width=30)
  115. info_id_entry.grid(column=1, row=0, padx=10, pady=10)
  116. show_info_button = ttk.Button(info_frame, text='Show Info', command=show_info)
  117. show_info_button.grid(column=1, row=1, padx=10, pady=10)
  118. name_label = ttk.Label(info_frame, text='Name:')
  119. email_label = ttk.Label(info_frame, text='Email:')
  120. phone_label = ttk.Label(info_frame, text='Phone:')
  121. image_label = ttk.Label(info_frame, text='Image:')
  122. name_entry = ttk.Entry(info_frame, width=30, state='disabled')
  123. email_entry = ttk.Entry(info_frame, width=30, state='disabled')
  124. phone_entry = ttk.Entry(info_frame, width=30, state='disabled')
  125. image_path = tk.StringVar()
  126. image_button = ttk.Button(info_frame, text='View Image', state='disabled')
  127. info_image = ttk.Label(info_frame)
  128. # 管理员页面
  129. def show_records():
  130. status = status_var.get()
  131. query = "SELECT records.id, users.name, records.status, records.time FROM records JOIN users ON records.user_id=users.id WHERE 1=1"
  132. if status != 'All':
  133. query += " AND records.status='" + status + "'"
  134. if from_date_var.get() != '':
  135. query += " AND records.time>='" + from_date_var.get() + "'"
  136. if to_date_var.get() != '':
  137. query += " AND records.time<='" + to_date_var.get() + " 23:59:59'"
  138. records = c.execute(query).fetchall()
  139. for i in record_tree.get_children():
  140. record_tree.delete(i)
  141. for record in records:
  142. record_tree.insert('', 'end', values=(record[0], record[1], record[2], record[3]))
  143. def export_records():
  144. status = status_var.get()
  145. query = "SELECT records.id, users.name, records.status, records.time FROM records JOIN users ON records.user_id=users.id WHERE 1=1"
  146. if status != 'All':
  147. query += " AND records.status='" + status + "'"
  148. if from_date_var.get() != '':
  149. query += " AND records.time>='" + from_date_var.get() + "'"
  150. if to_date_var.get() != '':
  151. query += " AND records.time<='" + to_date_var.get() + " 23:59:59'"
  152. records = c.execute(query).fetchall()
  153. df = pd.DataFrame(records, columns=['ID', 'Name', 'Status', 'Time'])
  154. df.to_csv('records.csv', index=False)
  155. status_var = tk.StringVar(value='All')
  156. status_label = ttk.Label(admin_frame, text='Status:')
  157. status_label.grid(column=0, row=0, padx=10, pady=10)
  158. status_combobox = ttk.Combobox(admin_frame, textvariable=status_var, values=('All', 'In', 'Out'), state='readonly', width=10)
  159. status_combobox.grid(column=1, row=0, padx=10, pady=10)
  160. from_date_label = ttk.Label(admin_frame, text='From:')
  161. from_date_label.grid(column=2, row=0, padx=10, pady=10)
  162. from_date_var = tk.StringVar()
  163. from_date_entry = ttk.Entry(admin_frame, textvariable=from_date_var, width=10)
  164. from_date_entry.grid(column=3, row=0, padx=10, pady=10)
  165. to_date_label = ttk.Label(admin_frame, text='To:')
  166. to_date_label.grid(column=4, row=0, padx=10, pady=10)
  167. to_date_var = tk.StringVar()
  168. to_date_entry = ttk.Entry(admin_frame, textvariable=to_date_var, width=10)
  169. to

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/491104
推荐阅读
相关标签
  

闽ICP备14008679号