构建智能门禁安防系统:树莓派 4B、OpenCV、SQLite 和 MQTT 的应用(代码示例)
一、项目概述
1.1 项目目标和用途
本项目旨在开发一个智能门禁安防系统,该系统利用摄像头和人脸识别技术,结合本地人脸库,实现对进出人员的自动识别和管理。系统能够实时记录进出人员的信息,并对未注册人员进行警报提示。通过与物联网平台的集成,用户可以远程监控和管理门禁系统,提升安全性和管理效率。
1.2 解决的问题和价值
传统的门禁系统往往依赖于钥匙或密码,存在安全隐患和管理不便的问题。本项目通过人脸识别技术,解决了以下问题:
-
安全性:有效防止未授权人员进入,提高安全防护级别。
-
便捷性:无需携带钥匙或记住密码,提升用户体验。
-
数据管理:自动记录进出人员信息,便于后续查询和管理。
二、系统架构
2.1 系统架构设计
系统架构主要由以下几个部分组成:
-
摄像头模块:负责实时采集视频流。
-
人脸识别模块:使用OpenCV进行人脸检测和识别。
-
数据库模块:存储人脸信息和进出记录。
-
物联网平台:实现远程监控和管理。
2.2 选择的硬件和技术栈
-
单片机:选择树莓派作为主控单元,因其强大的处理能力和丰富的接口。
-
摄像头:使用USB摄像头,支持1080P高清图像采集。
-
通信协议:使用MQTT协议与物联网平台进行通信。
-
数据库:使用SQLite作为本地数据库,存储人脸数据和记录。
2.3 系统架构图
三、环境示例和注意事项
3.1 环境示例
-
硬件环境:
-
树莓派 4B
-
USB 摄像头
-
Wi-Fi 模块(内置)
-
-
软件环境:
-
操作系统:Raspberry Pi OS
-
开发语言:Python
-
依赖库:OpenCV, SQLite, Paho-MQTT
-
3.2 注意事项
-
确保摄像头安装位置合理,能够清晰捕捉到人脸。
-
数据库定期备份,防止数据丢失。
-
人脸库需定期更新,确保识别准确率。
四、代码实现
4.1 功能模块实现
本系统主要分为以下几个功能模块,每个模块负责特定的功能,确保系统的整体运行。
4.1.1 摄像头采集模块
功能描述:该模块负责实时采集视频流,并将视频帧传递给人脸识别模块进行处理。
代码实现:
import cv2def capture_video():# 初始化摄像头cap = cv2.VideoCapture(0) # 0表示默认摄像头if not cap.isOpened():print("无法打开摄像头")returnwhile True:ret, frame = cap.read() # 读取视频帧if not ret:print("无法读取视频帧")break# 显示视频流cv2.imshow('Video', frame)# 按下 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release() # 释放摄像头cv2.destroyAllWindows() # 关闭所有OpenCV窗口# 调用摄像头采集函数
capture_video()
代码说明:
-
cv2.VideoCapture(0):初始化摄像头,0表示使用默认摄像头。 -
cap.read():读取视频帧,返回值ret表示是否成功读取,frame是当前帧的图像数据。 -
cv2.imshow('Video', frame):显示当前帧。 -
cv2.waitKey(1):等待1毫秒,检查是否按下了退出键(‘q’)。
4.1.2 人脸识别模块
功能描述:该模块使用OpenCV进行人脸检测和识别,将识别到的人脸与本地人脸库进行比对。
代码实现:
import cv2
import numpy as np
import sqlite3def recognize_face(frame):# 加载人脸检测模型face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 将图像转换为灰度图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)for (x, y, w, h) in faces:# 在检测到的人脸周围绘制矩形框cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)# 进行人脸识别face_id = identify_face(gray[y:y+h, x:x+w]) # 识别函数if face_id is not None:print(f"识别到用户ID: {face_id}")else:print("未识别到用户,进行警报提示")return frame, facesdef identify_face(face_image):# 这里可以添加人脸识别的具体实现# 假设我们有一个简单的识别逻辑# 返回识别到的用户ID或Nonereturn None # 目前返回None表示未识别到用户# 示例调用
cap = cv2.VideoCapture(0)
while True:ret, frame = cap.read()if not ret:breakframe, faces = recognize_face(frame)cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()
代码说明:
-
cv2.CascadeClassifier:加载人脸检测模型。 -
detectMultiScale:检测图像中的人脸,返回人脸的坐标。 -
cv2.rectangle:在检测到的人脸周围绘制矩形框。 -
identify_face:调用识别函数进行人脸识别,返回识别到的用户ID。
4.1.3 数据库管理模块
功能描述:该模块负责管理人脸库和进出记录,包括添加新用户、查询用户信息和记录进出时间。
代码实现:
import sqlite3def create_database():# 连接到SQLite数据库(如果数据库不存在,则会创建一个新的数据库)conn = sqlite3.connect('access_control.db')cursor = conn.cursor()# 创建用户表cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,face_encoding BLOB NOT NULL)''')# 创建进出记录表cursor.execute('''CREATE TABLE IF NOT EXISTS access_logs (log_id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER,access_time DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users (id))''')conn.commit() # 提交更改conn.close() # 关闭数据库连接def add_user(name, face_encoding):conn = sqlite3.connect('access_control.db')cursor = conn.cursor()# 插入新用户cursor.execute('''INSERT INTO users (name, face_encoding) VALUES (?, ?)''', (name, face_encoding))conn.commit()conn.close()def log_access(user_id):conn = sqlite3.connect('access_control.db')cursor = conn.cursor()# 记录进出日志cursor.execute('''INSERT INTO access_logs (user_id) VALUES (?)''', (user_id,))conn.commit()conn.close()def get_user_by_id(user_id):conn = sqlite3.connect('access_control.db')cursor = conn.cursor()# 查询用户信息cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,))user = cursor.fetchone()conn.close()return userdef get_all_users():conn = sqlite3.connect('access_control.db')cursor = conn.cursor()# 查询所有用户cursor.execute('SELECT * FROM users')users = cursor.fetchall()conn.close()return users# 示例调用
create_database() # 创建数据库和表
add_user('张三', b'face_encoding_data') # 添加用户(face_encoding_data为人脸编码数据的二进制形式)
log_access(1) # 记录用户ID为1的进出日志
users = get_all_users() # 获取所有用户
print(users)
代码说明:
-
create_database():创建SQLite数据库和用户表、进出记录表。 -
add_user(name, face_encoding):向用户表中添加新用户,face_encoding为人脸编码的二进制数据。 -
log_access(user_id):记录用户的进出日志,保存用户ID和当前时间。 -
get_user_by_id(user_id):根据用户ID查询用户信息。 -
get_all_users():获取所有用户的信息。
时序图:
4.1.4 物联网通信模块
功能描述:该模块负责与物联网平台进行通信,发送进出记录和接收远程指令。
代码实现:
import datetimedef publish_access_log(user_id):log_data = {'user_id': user_id,'access_time': str(datetime.datetime.now())}# 将日志数据转换为JSON格式client.publish(MQTT_TOPIC, json.dumps(log_data))print(f"已发布进出日志: {log_data}")# 启动MQTT客户端循环
def start_mqtt():client.loop_start() # 启动循环,处理网络流量和回调# 示例调用
start_mqtt() # 启动MQTT客户端
publish_access_log(1) # 发布用户ID为1的进出日志# 在主程序中,确保在适当的地方调用publish_access_log函数
# 例如,在识别到用户后记录进出日志并发布
代码说明:
-
publish_access_log(user_id):构建一个包含用户ID和当前时间的日志数据字典,并将其转换为JSON格式后,通过MQTT发布到指定主题。 -
client.loop_start():启动MQTT客户端的网络循环,处理消息的发送和接收。 -
on_connect(client, userdata, flags, rc):连接成功时的回调函数,订阅指定的主题。 -
on_message(client, userdata, msg):接收到消息时的回调函数,用于处理来自物联网平台的指令。
时序图:
4.2 模块代码流程和时序图
4.2.1 整体流程
整个系统的工作流程如下:
-
摄像头采集模块:实时采集视频流并传递给人脸识别模块。
-
人脸识别模块:检测视频帧中的人脸,并与数据库中的人脸库进行比对。如果识别成功,记录用户ID并调用数据库管理模块记录进出日志;如果未识别到用户,则触发警报。
-
数据库管理模块:管理用户信息和进出记录,提供添加用户、记录日志和查询用户的功能。
-
物联网通信模块:将进出日志通过MQTT协议发送到物联网平台,并接收远程指令。
4.2.2 整体时序图
五、项目总结
5.1 项目主要功能
本项目实现了一个智能门禁安防系统,主要功能包括:
-
实时视频采集与人脸识别。
-
本地数据库管理用户信息和进出记录。
-
通过MQTT协议与物联网平台进行通信,实现远程监控和管理。
5.2 实现过程
在实现过程中,我们首先设计了系统架构,选择了合适的硬件和软件技术栈。接着,逐步实现了各个功能模块,包括摄像头采集、人脸识别、数据库管理和物联网通信。每个模块的代码逻辑清晰,易于理解和维护。
相关文章:
构建智能门禁安防系统:树莓派 4B、OpenCV、SQLite 和 MQTT 的应用(代码示例)
一、项目概述 1.1 项目目标和用途 本项目旨在开发一个智能门禁安防系统,该系统利用摄像头和人脸识别技术,结合本地人脸库,实现对进出人员的自动识别和管理。系统能够实时记录进出人员的信息,并对未注册人员进行警报提示。通过与…...
基于 Konva 实现Web PPT 编辑器(二)
动画系统 为了实现演示中复杂的动画效果,使用 Animation 类统一管理;切换动画通过 css animation 实现,并且是应用在 konvajs-content 上,动画则通过 gsap 实现,应用在 Konva.Node 上,实现思路如下…...
【开源免费】基于SpringBoot+Vue.JS在线竞拍系统(JAVA毕业设计)
本文项目编号 T 013 ,文末自助获取源码 \color{red}{T013,文末自助获取源码} T013,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...
Qt TabWidget添加多个窗口,实现分页窗体布局
Qt TabWidget添加多个窗口窗体,可关闭与打开 点击按钮可判断是否打开,避免重复打开 使用Qt中的TabWidget组件创建一个简单的分页窗体布局。点击按钮时,会新增一个窗体并添加到TabWidget中。每个子窗体能动态获取父窗体指针以进行操作 分别…...
HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践
本文列举了部分用于优化动画时延的正反案例,帮助开发者在遇到相似场景时进行优化,解决构建页面动画时遇到动画时延较长的问题。 减少动画丢帧 在播放动画或者生成动画时,画面产生停滞而导致帧率过低的现象,称为动画丢帧。 播放…...
基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建
一.生成映射字典 接下来需要将每个汉字、边界、拼音、偏旁部首等映射成向量。所以,我们首先需要来构造字典,统计多少个不同的字、边界、拼音、偏旁部首等,然后再构建模型将不同的汉字、拼音等映射成不同的向量。 在prepare_data.py中自定义…...
5.sklearn-朴素贝叶斯算法、决策树、随机森林
文章目录 环境配置(必看)头文件引用1.朴素贝叶斯算法代码运行结果优缺点 2.决策树代码运行结果决策树可视化图片优缺点 3.随机森林代码RandomForestClassifier()运行结果总结 本章学习资源 环境配置(必看) Anaconda-创建虚拟环境…...
VMWARE VCENTER6.7 VCSA通过Web5480进行版本升级
VCENTER当前版本如下图 操作前先给VCENTER打一个快照,出问题可以立即回退 1、先下载VCSA镜像,并将VCSA镜像上传至DataStore中; 2、选中VCSA虚拟机,编辑配置 3、挂载新上传的VCSA镜像,一定要勾选“已连接”和“打开电源…...
GIT使用常见问题
如何安装Git? 在Windows操作系统中,可以从Git官方网站(https://git-scm.com)下载最新的Git安装程序,然后按照提示进行安装。在Mac操作系统中,可以使用Homebrew或者直接从Git官方网站下载安装程序进行安装。…...
内核链表
一、特点 灵活性 内核链表可以连接各种不同类型的数据结构,因为它只包含指向下一个和上一个节点的指针,不依赖特定的数据类型,这使得内核开发者可以根据不同的需求灵活地使用它。你可以将不同类型的结构体通过内核链表连接起来,实…...
行空板上YOLO和Mediapipe视频物体检测的测试
Introduction 经过前面三篇教程帖子(yolov8n在行空板上的运行(中文),yolov10n在行空板上的运行(中文),Mediapipe在行空板上的运行(中文))的介绍,…...
【Spring Boot 3】【Web】ProblemDetail
【Spring Boot 3】【Web】ProblemDetail 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...
市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1
目录 一、简介 二、TFT-LCD驱动系统概述 (一)系统概述 (二)设计要点 二、扫描驱动电路设计 (一)概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 (二)…...
Linux基础 -- 获取CPU负载信息
Linux Kernel 获取当前负载情况 本文档介绍了如何在 Linux 内核中获取系统的负载情况。我们将从用户态程序、内核模块开发等角度展示相关方法。 1. 通过 /proc/loadavg 文件获取负载 /proc/loadavg 文件包含了系统的负载信息,通常包括过去 1 分钟、5 分钟和 15 分…...
Django 中的用户界面 - 创建速度计算器
在 Django 中创建一个用户界面来计算速度,可以通过以下步骤完成。这个速度计算器将允许用户输入距离和时间,计算并显示速度。 一、问题背景 一位 Django 新手希望使用 Django 构建一个用户界面,以便能够计算速度(速度 距离/时间…...
spring security 如何解决跨域的
一、什么是 CORS CORS(Cross-Origin Resource Sharing) 是由 W3C制定的一种跨域资源共享技术标准,其目就是为了解决前端的跨域请求。在JavaEE 开发中,最常见的前端跨域请求解决方案是早期的JSONP,但是JSONP 只支持 GET 请求,这是一…...
日志系统前置知识
日志:程序运行过程中所记录的程序运行状态信息。通过这些信息,以便于程序员能够随时根据状态信息,对系统的运行状态进行分析。功能:能够让用户非常简便的进行日志的输出以及控制。 同步写日志 同步日志是指当输出日志时ÿ…...
【Spring Boot 3】【Web】全局异常处理
【Spring Boot 3】【Web】全局异常处理 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…...
Dcoker 运行es
1,创建network docker network create my-network 2,docker运行es容器 docker run -d --name es-container --net my-network -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" docker.elastic.co/elasticsearch/elasticsearch:7…...
7系列FPGA HR/HP I/O区别
HR High Range I/O with support for I/O voltage from 1.2V to 3.3V. HP High Performance I/O with support for I/O voltage from 1.2V to 1.8V. UG865:Zynq-7000 All Programmable SoC Packaging and Pinout...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
