智慧社区(八)——社区人脸识别出入管理系统设计与实现

在社区安全管理日益智能化的背景下,传统的人工登记方式已难以满足高效、精准的管理需求。本文将详细介绍一套基于人脸识别技术的社区出入管理系统,该系统通过整合腾讯云 AI 接口、数据库设计与业务逻辑,实现了居民出入自动识别、记录追踪与访客管理的全流程数字化,为社区安全管理提供了高效解决方案。

系统核心模块概述

系统主要包含三大功能模块:

  • 人脸识别出入管理:通过调用第三方人脸识别 API,实现居民身份自动核验与出入状态记录
  • 出入记录查询统计:对居民出入数据进行多条件查询、分页展示与统计分析
  • 访客登记管理:支持访客信息的增删改查,补充非居民出入的管理场景

一、人脸识别出入管理模块

1.1 实现思路

人脸识别是系统的核心功能,其设计目标是实现 "刷脸" 即可完成身份核验与出入记录,核心流程如下:

  1. 小区信息加载:前端通过接口获取所有小区列表,供用户选择当前操作的小区(用于后续权限校验)
  2. 人脸信息核验:调用腾讯云人脸识别 API,验证传入图片中是否包含有效人脸(且仅一张)
  3. 身份匹配:将人脸信息与系统人员库比对,确认是否为已登记居民
  4. 权限校验:验证该居民是否属于当前选择的小区,确保仅本小区居民可正常出入
  5. 出入状态记录:根据居民当前的出入状态(通过outTime字段是否为空判断),更新或创建出入记录,同时保存出入时的人脸图片

1.2 核心代码实现

1.2.1 小区列表接口

小区列表是权限校验的基础,接口通过查询数据库返回所有小区信息,供前端下拉选择:

/*** 获取小区列表(用于前端选择与权限校验)* @return 包含小区列表的响应结果*/
@GetMapping("/communityList")
public Result communityList() {// 查询所有小区信息(社区名称、ID等核心字段)List<Community> communityList = communityService.list();return Result.ok().put("data", communityList);
}

该接口直接调用 MyBatis-Plus 的list()方法查询全量小区数据,确保前端能实时获取最新的小区信息,为后续 "居民 - 小区" 权限匹配提供基础。

1.2.2 人脸识别核心接口

该接口是整个模块的核心,整合了人脸比对、权限校验、记录更新等全流程逻辑:

/*** 人脸识别与出入记录处理* @param inOutFaceForm 包含人脸图片Base64编码、文件格式、小区ID的表单* @return 识别结果与操作状态*/
@PostMapping("/add")
public Result add(@RequestBody InOutFaceForm inOutFaceForm) {// 1. 调用腾讯云人脸识别API,在人员库中搜索匹配人脸FaceApi faceApi = new FaceApi();RootResp resp = faceApi.searchPersonsReturnsByGroup(apiConfiguration, inOutFaceForm.getFileBase64());// 2. 处理API响应结果if (resp.getRet() == 0) { // 接口调用成功// 解析API返回的JSON数据,提取匹配的人员信息JSONObject object = JSONObject.parseObject(resp.getData().toString());JSONArray resultsReturnsByGroup = object.getJSONArray("ResultsReturnsByGroup");JSONObject returnsByGroup = resultsReturnsByGroup.getJSONObject(0);JSONArray groupCandidates = returnsByGroup.getJSONArray("GroupCandidates");JSONObject candidatesObj = groupCandidates.getJSONObject(0);JSONArray candidates = candidatesObj.getJSONArray("Candidates");// 3. 匹配系统中的居民信息(人员库ID与本地数据库关联)Person targetPerson = null;for (int i = 0; i < candidates.size(); i++) {JSONObject personInfo = candidates.getJSONObject(i);String personId = personInfo.getString("PersonId").substring(4); // 截取实际ID(去除前缀)long pid = Integer.parseInt(personId);Person person = personService.getById(pid);// 校验人脸ID与本地存储的人脸图片ID是否匹配(确保身份唯一)if (person != null) {String faceUrl = person.getFaceUrl();if (faceUrl != null && !faceUrl.isEmpty()) {String faceId = personInfo.getString("FaceId");String localFaceId = faceUrl.substring(faceUrl.lastIndexOf("/") + 1, faceUrl.lastIndexOf("."));if (faceId.equals(localFaceId)) {targetPerson = person;break;}}}}// 4. 身份与权限校验if (targetPerson == null) {return Result.ok().put("data", "人员信息不存在(未登记)");}// 校验当前选择的小区是否与居民所属小区一致if (inOutFaceForm.getCommunityId() != targetPerson.getCommunityId()) {return Result.ok().put("data", "非本小区居民,请联系管理员");}// 5. 处理出入记录(判断是"进入"还是"离开")InOutRecord record = new InOutRecord();record.setCommunityId(targetPerson.getCommunityId());record.setPersonId(targetPerson.getPersonId());// 保存人脸图片(Base64解码为文件,存储到服务器)String newFileName = UUID.randomUUID() + "." + inOutFaceForm.getExtName();String filePath = face + newFileName; // 本地存储路径Base64Util.decoderBase64File(inOutFaceForm.getFileBase64(), filePath);String picUrl = urlPrefix + "community/upload/face/" + newFileName; // 访问URL// 查询该居民是否有未完成的出入记录(outTime为空表示"在小区内")InOutRecord existingRecord = inOutRecordMapper.getInOutRecord(record);if (existingRecord == null) {// 无未完成记录 → 新增"进入"记录record.setInPic(picUrl);record.setInTime(LocalDateTime.now());inOutRecordMapper.insert(record);return Result.ok().put("data", "【" + targetPerson.getUserName() + "】进入小区");} else {// 有未完成记录 → 更新"离开"记录existingRecord.setOutPic(picUrl);existingRecord.setOutTime(LocalDateTime.now());inOutRecordMapper.updateById(existingRecord);return Result.ok().put("data", "【" + targetPerson.getUserName() + "】离开小区");}} else {// API调用失败(如人脸不清晰、无有效人脸等)return Result.ok().put("data", "人脸识别失败:错误码=" + resp.getRet() + ",原因=" + resp.getMsg());}
}

1.3 技术细节说明

  • 人脸图片处理:前端传入的人脸图片以 Base64 编码格式传输,后端通过Base64Util解码为文件,存储到服务器指定目录,并生成可访问的 URL(用于记录与后续查看)
  • 腾讯云 API 封装:通过FaceApi类统一封装人脸识别相关接口(如searchPersonsReturnsByGroup用于人脸搜索),简化业务层调用
  • 出入状态判断:通过查询in_out_record表中是否存在outTime为空的记录,判断居民当前是 "进入" 还是 "离开",确保记录的连续性与准确性
  • 权限校验逻辑:通过比对居民所属小区 ID 与当前选择的小区 ID,防止非本小区居民随意出入,增强社区安全性

二、出入记录查询统计模块

2.1 表结构设计

in_out_record表用于存储居民出入的详细信息,核心字段设计如下:

字段名类型说明
in_out_record_idint主键 ID(自增)
person_idint关联居民 ID(外键)
community_idint关联小区 ID(外键)
in_timedatetime进入时间
out_timedatetime离开时间(可为空,标识未离开)
in_picvarchar进入时人脸图片 URL
out_picvarchar离开时人脸图片 URL

2.2 核心功能实现

2.2.1 出入记录分页查询

支持按时间范围、小区、居民等条件查询,返回分页结果:

/*** 出入记录多条件查询* @param form 包含查询条件(开始时间、结束时间、小区ID等)* @return 分页的出入记录列表*/
@GetMapping("/list")
public Result getInOutList(InOutRecordListForm form) {PageVO pageVO = inOutRecordService.getInOutRecordList(form);return Result.ok().put("data", Collections.singletonMap("pageList", pageVO));
}

服务层通过InOutRecordListForm接收前端参数,整合 MyBatis-Plus 的分页插件,实现带条件的分页查询,支持前端表格展示与分页交互。

2.2.2 数据统计分析

提供小区出入数据的统计图表(如每日出入次数、高峰时段等):

/*** 小区出入数据统计* @return 统计结果(按天/按时段的出入次数等)*/
@GetMapping("/chart")
public Result chart() {Map<String, Object> stats = inOutRecordService.chart();return Result.ok().put("data", stats);
}

通过 SQL 聚合查询(如按日期分组统计in_time数量),生成可视化所需的数据,辅助社区管理人员掌握出入规律。

三、访客登记管理模块

对于非小区居民的访客,系统提供专门的访客登记模块,通过manual_record表管理访客信息,核心功能包括:

  • 访客信息添加:登记访客姓名、身份证号、到访事由、访问时间等信息
  • 访客记录查询:支持按时间、姓名、小区等条件查询历史访客
  • 记录维护:提供访客信息的修改、删除功能,满足管理需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94463.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发学习———Linux环境下IO进程线程学习(四)

进程相关函数fork创建一个子进程&#xff0c;子进程复制父进程的地址空间。父进程返回子进程PID&#xff0c;子进程返回0。pid_t pid fork(); if (pid 0) { /* 子进程代码 */ } else { /* 父进程代码 */ }getpid获取当前进程的PID。pid_t pid getpid();getppid获取父进程的P…

标记-清除算法中的可达性判定与Chrome DevTools内存分析实践

引言 在现代前端开发中&#xff0c;内存管理是保证应用性能与用户体验的核心技术之一。作为JavaScript运行时的基础机制&#xff0c;标记-清除算法(Mark-and-Sweep) 通过可达性判定决定哪些内存需要回收&#xff0c;而Chrome DevTools提供的Memory工具则为开发者提供了深度的内…

微算法科技(NASDAQ:MLGO)基于量子重加密技术构建区块链数据共享解决方案

随着信息技术的飞速发展&#xff0c;数据已成为数字经济时代的核心生产要素。数据的共享和安全往往是一对难以调和的矛盾。传统的加密方法在面对日益强大的计算能力和复杂的网络攻击时&#xff0c;安全性受到了挑战。微算法科技(NASDAQ&#xff1a;MLGO)通过引入量子重加密技术…

FastAPI快速入门P2:与SpringBoot比较

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录引言1 FastAPI事件管理2 类的使用2.1 初始化方法对…

SAP-ABAP: Open SQL集合函数COUNT(统计行数)、SUM(数值求和)、AVG(平均值)、MAX/MIN(极值)深度指南

SAP Open SQL集合函数深度指南 1. 核心价值与特性函数作用关键特性COUNT统计行数用COUNT(*)包含NULL值行&#xff0c;COUNT(字段)排除NULLSUM数值求和自动过滤NULL值&#xff0c;结果类型与源字段相同AVG平均值必须用TYPE f接收&#xff0c;否则四舍五入导致精度丢失MAX/MIN极值…

【docker】UnionFS联合操作系统

Linux 的 Namespace、CGroups 和 UnionFS 三大技术支撑了 Docker 的实现。 一、为什么需要联合文件系统&#xff1f;在传统操作系统中&#xff0c;每个文件系统都是独立的孤岛。但当我们需要&#xff1a;合并多个目录的内容保持基础系统不变的同时进行修改高效共享重复文件内容…

CTF-XXE 漏洞解题思路总结

一、XXE 漏洞简介XXE (XML External Entity) 漏洞允许攻击者通过构造恶意的 XML 输入&#xff0c;强迫服务器的 XML 解析器执行非预期的操作。在 CTF 场景中&#xff0c;最常见的利用方式是让解析器读取服务器上的敏感文件&#xff0c;并将其内容返回给攻击者。二、核心攻击载荷…

GitLab:一站式 DevOps 平台的全方位解析

GitLab&#xff1a;一站式 DevOps 平台的全方位解析 在当今数字化时代&#xff0c;软件研发的效率与质量直接决定企业的市场竞争力。GitLab 作为全球领先的 DevOps 平台&#xff0c;凭借 “从构思到部署” 的全流程管理能力&#xff0c;已成为无数企业加速软件交付的核心工具。…

Flink富函数:一种更灵活、可扩展的方式来定义数据流的处理逻辑

本文重点 Flink中的富函数类是一组用于处理数据流的函数接口和实现类。富函数类提供了一种更灵活和可扩展的方式来定义数据流的处理逻辑。 富函数类 富函数类是DataStream API提供的一个函数类的接口,所有的Flink函数类都有其Rich版本。富函数类一般是以抽象类的形式出现的。…

【STM32】HAL库中的实现(四):RTC (实时时钟)

&#x1f552;HAL库中的实现&#xff1a;RTC&#xff08;Real-Time Clock&#xff09;实时时钟RTC 是 STM32 的低功耗实时时钟模块&#xff0c;常用于&#xff1a; 实时时间维护&#xff08;年月日时分秒&#xff09;定时唤醒日志时间戳闹钟功能RTC&#xff08;实时时钟&#x…

Pauli 矩阵指数函数展开为显式矩阵 e^A -> B

要展开表达式 为普通矩阵&#xff0c;其中 是 Pauli 矩阵&#xff0c; 是单位向量&#xff0c; 是实数。以下是详细推导步骤&#xff1a;1. Pauli 矩阵的性质Pauli 矩阵定义为&#xff1a;它们满足以下关系&#xff1a;​其中 是 Kronecker delta&#xff0c;​ 是 Levi-…

【Algorithm | 0x03 搜索与图论】DFS

DFS基础知识典型例题例1&#xff1a;n皇后问题例2&#xff1a;拍照例3&#xff1a;理发基础知识 核心原理&#xff1a;一条路走到黑 示意图&#xff1a;其含义表示&#xff0c;在这个图中顶层是第0层&#xff0c;也就是后面dfs的入口&#xff0c;一般从dfs(0)开始操作。 模版&a…

Redis的数据过期策略有哪些?

Redis内部通过两种主要策略来处理过期的Key&#xff1a; 惰性删除 惰性删除&#xff1a;顾明思议并不是在TTL到期后就立刻删除&#xff0c;而是在访问一个key的时候&#xff0c;Redis会先检查这个键是否过期。如果过期&#xff0c;就删除它&#xff0c;然后返回nil。 这种方式非…

水库雨水情测报和大坝安全监测系统解决方案

一、方案背景 在全球气候变化和极端天气频发的背景下&#xff0c;水库作为重要的水利设施&#xff0c;承担着防洪、供水、灌溉、发电等多重功能。然而&#xff0c;由于水库蓄水量巨大&#xff0c;一旦发生溃坝或运行异常&#xff0c;将对下游地区造成不可估量的生命财产损失。因…

BFS 和 DFS 编程思想、框架、技巧及经典例题总结

BFS 和 DFS 编程思想、框架、技巧及经典例题总结 一、核心编程思想 BFS&#xff08;广度优先搜索&#xff09; 核心思想&#xff1a;以「层次遍历」为核心&#xff0c;从起点出发&#xff0c;优先探索距离起点最近的节点&#xff0c;逐层扩散遍历。本质&#xff1a;通过「队列」…

【面试场景题】日志去重与统计系统设计

文章目录题目场景描述要求问题考察点解答思考一、核心解决方案&#xff08;基础版&#xff0c;单节点32GB内存、10台节点&#xff09;1. 整体架构选型2. 关键步骤详解&#xff08;1&#xff09;数据分片&#xff1a;解决“数据量大&#xff0c;单节点处理不了”的问题&#xff…

【Day 16】Linux-性能查看

目录 一、Stress系统压力测试工具 二、性能查看 &#xff08;一&#xff09;查看CPU # nproc # lscpu # top # uptime # mpstat 数字1 数字2 &#xff08;二&#xff09;查看内存 # dmidecode -t memory | less # free -h # …

【ICCV2017】Deformable Convolutional Networks

一、摘要尽管卷积神经网络&#xff08;CNN&#xff09;在视觉识别任务上取得巨大成功&#xff0c;但其固有的固定几何结构&#xff08;固定卷积采样网格、固定池化窗口、固定 RoI 划分&#xff09;严重限制了对未知几何变换&#xff08;尺度、姿态、形变、视角变化&#xff09;…

echarts在前后端分离项目中的实践与应用

目录 一、ECharts简介 二、后端数据接口设计 三、数据结构设计 1. 柱状图数据结构 2. 饼图数据结构 四、后端实现要点 五、前端ECharts配置解析 1. 柱状图配置 2. 饼图配置 六、最佳实践建议 七、总结 一、ECharts简介 ECharts是百度开源的一个基于JavaScript的可视…

SQL 四大语言分类详解:DDL、DML、DCL、DQL

SQL&#xff08;结构化查询语言&#xff09;通常被分为四种主要类型&#xff0c;每种类型负责不同的数据库操作。下面我将详细介绍这四类SQL语言的语法和用途。一、DDL (Data Definition Language) 数据定义语言功能&#xff1a;定义和管理数据库对象结构&#xff08;表、视图、…