构建智能门禁安防系统:树莓派 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...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
