智慧社區(八)——社區人臉識別出入管理系統設計與實現

在社區安全管理日益智能化的背景下,傳統的人工登記方式已難以滿足高效、精準的管理需求。本文將詳細介紹一套基于人臉識別技術的社區出入管理系統,該系統通過整合騰訊云 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
英文地址,請注明出處:http://en.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;表、視圖、…