当前位置: 首页 > news >正文

构建智能门禁安防系统:树莓派 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():获取所有用户的信息。

时序图:

User Database 添加用户 确认添加 记录进出日志 确认记录 查询用户信息 返回用户信息 User Database

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):接收到消息时的回调函数,用于处理来自物联网平台的指令。

时序图:

User MQTTBroker 发布进出日志 确认发布 发送远程指令 确认接收指令 User MQTTBroker

4.2 模块代码流程和时序图

4.2.1 整体流程

整个系统的工作流程如下:

  1. 摄像头采集模块:实时采集视频流并传递给人脸识别模块。

  2. 人脸识别模块:检测视频帧中的人脸,并与数据库中的人脸库进行比对。如果识别成功,记录用户ID并调用数据库管理模块记录进出日志;如果未识别到用户,则触发警报。

  3. 数据库管理模块:管理用户信息和进出记录,提供添加用户、记录日志和查询用户的功能。

  4. 物联网通信模块:将进出日志通过MQTT协议发送到物联网平台,并接收远程指令。

4.2.2 整体时序图

User Camera FaceRecognition Database MQTTBroker 请求视频流 返回视频流 传递视频帧 返回识别结果 记录进出日志 确认记录 发布进出日志 确认发布 触发警报 alt [识别成功] [识别失败] User Camera FaceRecognition Database MQTTBroker

五、项目总结

5.1 项目主要功能

本项目实现了一个智能门禁安防系统,主要功能包括:

  • 实时视频采集与人脸识别。

  • 本地数据库管理用户信息和进出记录。

  • 通过MQTT协议与物联网平台进行通信,实现远程监控和管理。

5.2 实现过程

在实现过程中,我们首先设计了系统架构,选择了合适的硬件和软件技术栈。接着,逐步实现了各个功能模块,包括摄像头采集、人脸识别、数据库管理和物联网通信。每个模块的代码逻辑清晰,易于理解和维护。

相关文章:

构建智能门禁安防系统:树莓派 4B、OpenCV、SQLite 和 MQTT 的应用(代码示例)

一、项目概述 1.1 项目目标和用途 本项目旨在开发一个智能门禁安防系统,该系统利用摄像头和人脸识别技术,结合本地人脸库,实现对进出人员的自动识别和管理。系统能够实时记录进出人员的信息,并对未注册人员进行警报提示。通过与…...

基于 Konva 实现Web PPT 编辑器(二)

动画系统 为了实现演示中复杂的动画效果,使用 Animation 类统一管理;切换动画通过 css animation 实现,并且是应用在 konvajs-content 上,动画则通过 gsap 实现,应用在 Konva.Node 上,实现思路如下&#xf…...

【开源免费】基于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驱动系统概述 (一)系统概述 (二)设计要点 二、扫描驱动电路设计 (一)概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 (二&#xff09…...

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 请求,这是一…...

日志系统前置知识

日志:程序运行过程中所记录的程序运行状态信息。通过这些信息,以便于程序员能够随时根据状态信息,对系统的运行状态进行分析。功能:能够让用户非常简便的进行日志的输出以及控制。 同步写日志 同步日志是指当输出日志时&#xff…...

【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...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...

Centos 7 服务器部署多网站

一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...