文章目录

  • 1.背景概述
  • 2.设计方案
  • 3.实验详细步骤
  • 4.系统性能测试和分析

1.背景概述

由于我们学校有的宿舍在校外,人员流动性大,人员身份复杂,学生安全意识相对薄弱等几大特点,学生的财产安全及学生宿舍管理问题急需有待解诀,其中尤为突出的又表现在现有门锁的不安全及管理上诸多不便。现常用普通机械门锁主要有以下几大不便:顺手不能锁门、钥匙容易复制、容易丢失且不能挂失、无法查询开门记录、防盜性能极差、外观简单。鉴于以上原因学校不得不陷入循环换锁的尴尬之中,浪费巨大的人力、物力与财力并且还是无法从根本上解诀问题。人脸智能门锁从根本上解诀了以上问题,所以学生宿舍改用人脸智能门锁就势在必行了。人脸智能门锁是现在高度文明的表现,人脸智能门锁能够实时监控进入宿舍的人员并做记录,没有得到许可(需要宿舍长录入人脸)的人员是无法进入宿舍的,如果非法闯入还将引发警报。

2.设计方案

2.1框架设计
利用wxPython设计一个人机交互界面的窗口,便于更好的实现人机交互。
2.2宿舍管理
在这个模块中利用wxPython,sqlite3和dlib库结合完成人脸的录入、删除功能
(1)利用opencv打开笔记本摄像头完成人脸检测,并绘制矩形框,获取当前捕获到的图像的所有人脸特征与姓名和学号进行绑定存储到数据库。
(2)检测到人脸的同时需要与数据库中的人脸进行匹配,如果人脸相似就不在进行录入,如果录入就覆盖之前的人脸信息。
(3)删除人脸信息就是弹出一个对话框进行姓名填写,如果名字存在就将本地文件夹与数据库里面的该条数据删除,如果该名字不存在就弹出警告。
2.3监测人员
该模块与上面人脸录入模块设计类似,利用opencv调用摄像头完成人脸检测,并将检测到的人脸信息与存储的信息进行比对,如果有就将其存到日志表中。
2.4流动日志
该模块与监测人员模块相结合,将监测人员模块中得到的数据显示在表格中,反映人员的流动情况。

3.实验详细步骤

3.1.框架设计
(1)初始化

def __init__(self):wx.Frame.__init__(self,parent=None,title="宿舍管理系统",size=(920,560))self.initMenu()self.initInfoText()self.initGallery()self.initDatabase()self.initData()

(2)初始化菜单栏

def initMenu(self):menuBar = wx.MenuBar()  #生成菜单栏menu_Font = wx.Font()#Font(faceName="consolas",pointsize=20)menu_Font.SetPointSize(14)menu_Font.SetWeight(wx.BOLD)registerMenu = wx.Menu() #生成菜单self.new_register = wx.MenuItem(registerMenu,ID_NEW_REGISTER,"新建录入")self.new_register.SetBitmap(wx.Bitmap("F:/WorkAttendanceSystem-master/V2.0/drawable/new_register.png"))self.new_register.SetTextColour("SLATE BLUE")self.new_register.SetFont(menu_Font)registerMenu.Append(self.new_register)self.delete_member = wx.MenuItem(registerMenu,ID_DELETE_MEMBER,"人员删除")self.delete_member.SetBitmap(wx.Bitmap("F:/WorkAttendanceSystem-master/V2.0/drawable/finish_register.png"))self.delete_member.SetTextColour("SLATE BLUE")self.delete_member.SetFont(menu_Font)registerMenu.Append(self.delete_member)puncardMenu = wx.Menu()self.start_punchcard = wx.MenuItem(puncardMenu,ID_START_PUNCHCARD,"开始监测")self.start_punchcard.SetBitmap(wx.Bitmap("F:/WorkAttendanceSystem-master/V2.0/drawable/start_punchcard.png"))self.start_punchcard.SetTextColour("SLATE BLUE")self.start_punchcard.SetFont(menu_Font)puncardMenu.Append(self.start_punchcard)self.end_puncard = wx.MenuItem(puncardMenu,ID_END_PUNCARD,"退出监测")self.end_puncard.SetBitmap(wx.Bitmap("F:/WorkAttendanceSystem-master/V2.0/drawable/end_puncard.png"))self.end_puncard.SetTextColour("SLATE BLUE")self.end_puncard.SetFont(menu_Font)self.end_puncard.Enable(False)puncardMenu.Append(self.end_puncard)logcatMenu = wx.Menu()self.open_logcat = wx.MenuItem(logcatMenu,ID_OPEN_LOGCAT,"打开日志")self.open_logcat.SetBitmap(wx.Bitmap("F:/WorkAttendanceSystem-master/V2.0/drawable/open_logcat.png"))self.open_logcat.SetFont(menu_Font)self.open_logcat.SetTextColour("SLATE BLUE")logcatMenu.Append(self.open_logcat)self.close_logcat = wx.MenuItem(logcatMenu, ID_CLOSE_LOGCAT, "关闭日志")self.close_logcat.SetBitmap(wx.Bitmap("F:/WorkAttendanceSystem-master/V2.0/drawable/close_logcat.png"))self.close_logcat.SetFont(menu_Font)self.close_logcat.SetTextColour("SLATE BLUE")logcatMenu.Append(self.close_logcat)menuBar.Append(registerMenu,"&宿舍管理")menuBar.Append(puncardMenu,"&监测人员")menuBar.Append(logcatMenu,"&流动日志")self.SetMenuBar(menuBar)self.Bind(wx.EVT_MENU,self.OnNewRegisterClicked,id=ID_NEW_REGISTER)self.Bind(wx.EVT_MENU,self.delmember,id=ID_DELETE_MEMBER)self.Bind(wx.EVT_MENU,self.OnStartPunchCardClicked,id=ID_START_PUNCHCARD)self.Bind(wx.EVT_MENU,self.OnEndPunchCardClicked,id=ID_END_PUNCARD)self.Bind(wx.EVT_MENU,self.OnOpenLogcatClicked,id=ID_OPEN_LOGCAT)self.Bind(wx.EVT_MENU,self.OnCloseLogcatClicked,id=ID_CLOSE_LOGCAT)

3.2宿舍管理模块的设计
(1)新建录入

def register_cap(self,event):self.cap = cv2.VideoCapture(0)flag, im_rd = self.cap.read()# 每帧数据延时1ms,延时为0读取的是静态帧kk = cv2.waitKey(1)# 人脸数 detsdets = detector(im_rd, 1)# 检测到人脸if len(dets) != 0:biggest_face = dets[0]#取占比最大的脸maxArea = 0for det in dets:w = det.right() - det.left()h = det.top()-det.bottom()if w*h > maxArea:biggest_face = detmaxArea = w*h# 绘制矩形框cv2.rectangle(im_rd, tuple([biggest_face.left(), biggest_face.top()]),tuple([biggest_face.right(), biggest_face.bottom()]),(255, 0, 0), 2)img_height, img_width = im_rd.shape[:2]image1 = cv2.cvtColor(im_rd, cv2.COLOR_BGR2RGB)pic = wx.Bitmap.FromBuffer(img_width, img_height, image1)# 显示图片在panel上self.bmp.SetBitmap(pic)# 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arrshape = predictor(im_rd, biggest_face)features_cap = facerec.compute_face_descriptor(im_rd, shape)# 对于某张人脸,遍历所有存储的人脸特征for i,knew_face_feature in enumerate(self.knew_face_feature):# 将某张人脸与存储的所有人脸数据进行比对compare = return_euclidean_distance(features_cap, knew_face_feature)if compare == "same":  # 找到了相似脸self.infoText.AppendText(self.getDateAndTime()+"学号:"+str(self.knew_id[i])+" 姓名:"+self.knew_name[i]+" 的人脸数据已存在\r\n")self.flag_registed = Trueself.OnFinishRegister()_thread.exit()face_height = biggest_face.bottom()-biggest_face.top()face_width = biggest_face.right()- biggest_face.left()im_blank = np.zeros((face_height, face_width, 3), np.uint8)try:for ii in range(face_height):for jj in range(face_width):im_blank[ii][jj] = im_rd[biggest_face.top() + ii][biggest_face.left() + jj]if len(self.name)>0:cv2.imencode('.jpg', im_blank)[1].tofile(PATH_FACE + self.name + "/img_face_" + str(self.pic_num) + ".jpg")  # 正确方法self.pic_num += 1print("写入本地:", str(PATH_FACE + self.name) + "/img_face_" + str(self.pic_num) + ".jpg")self.infoText.AppendText(self.getDateAndTime()+"图片:"+str(PATH_FACE + self.name) + "/img_face_" + str(self.pic_num) + ".jpg保存成功\r\n")except:print("保存照片异常,请对准摄像头")if  self.new_register.IsEnabled():_thread.exit()if self.pic_num == 10:self.OnFinishRegister()_thread.exit()

(2)人员删除

def delmember(self,event):self.loadDataBase(1)self.name = wx.GetTextFromUser(message="请输入您的的姓名",caption="温馨提示",default_value="", parent=self.bmp)filePath = PATH_FACE + self.nameif self.name!='':if os.path.exists(filePath):con = sqlite3.connect('F:/WorkAttendanceSystem-master/V2.0/inspurer.db')cur = con.cursor()del_sql = "delete from worker_info where name = "+"'"+self.name+"'"print(del_sql)try:cur.execute(del_sql)con.commit()#提交事务except Exception as e:con.rollback()#删除失败则回滚finally:cur.close()con.close()for fileList in os.walk(filePath):for name in fileList[2]:os.chmod(os.path.join(fileList[0],name), stat.S_IWRITE)os.remove(os.path.join(fileList[0],name))shutil.rmtree(filePath)wx.MessageBox(message="删除成功", caption="提示")else:wx.MessageBox(message="此人不存在", caption="警告")self.initData()pass

3.3.监测人员
监测

def punchcard_cap(self,event):self.cap = cv2.VideoCapture(0)while self.cap.isOpened():flag, im_rd = self.cap.read()# 每帧数据延时1ms,延时为0读取的是静态帧kk = cv2.waitKey(1)# 人脸数 detsdets = detector(im_rd, 1)# 检测到人脸if len(dets) != 0:biggest_face = dets[0]# 取占比最大的脸maxArea = 0for det in dets:w = det.right() - det.left()h = det.top() - det.bottom()if w * h > maxArea:biggest_face = detmaxArea = w * h# 绘制矩形框cv2.rectangle(im_rd, tuple([biggest_face.left(), biggest_face.top()]),tuple([biggest_face.right(), biggest_face.bottom()]),(255, 0, 255), 2)img_height, img_width = im_rd.shape[:2]image1 = cv2.cvtColor(im_rd, cv2.COLOR_BGR2RGB)pic = wx.Bitmap.FromBuffer(img_width, img_height, image1)# 显示图片在panel上self.bmp.SetBitmap(pic)# 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arrshape = predictor(im_rd, biggest_face)features_cap = facerec.compute_face_descriptor(im_rd, shape)# 对于某张人脸,遍历所有存储的人脸特征for i, knew_face_feature in enumerate(self.knew_face_feature):# 将某张人脸与存储的所有人脸数据进行比对compare = return_euclidean_distance(features_cap, knew_face_feature)if compare == "same":  # 找到了相似脸nowdt = self.getDateAndTime()for j,logcat_name in enumerate(self.logcat_name):if logcat_name == self.knew_name[i]  and  nowdt[0:nowdt.index(" ")] == self.logcat_datetime[j][0:self.logcat_datetime[j].index(" ")]:breakelse:engine = pyttsx3.init()engine.say("Welcome !!")engine.runAndWait()self.insertARow([self.knew_id[i],self.knew_name[i],nowdt],2)if self.start_punchcard.IsEnabled():self.bmp.SetBitmap(wx.Bitmap(self.pic_index))_thread.exit()

3.4.流动日志
(1)打开日志

def OnOpenLogcatClicked(self,event):self.loadDataBase(2)#必须要变宽才能显示 scrollself.SetSize(980,560)grid = wx.grid.Grid(self,pos=(320,0),size=(920,560))grid.CreateGrid(100, 4)for i in range(100):for j in range(3):grid.SetCellAlignment(i,j,wx.ALIGN_CENTER,wx.ALIGN_CENTER)grid.SetColLabelValue(0, "学号") #第一列标签grid.SetColLabelValue(1, "姓名")grid.SetColLabelValue(2, "进入时间")grid.SetColSize(0,120)grid.SetColSize(1,120)grid.SetColSize(2,150)for i,id in enumerate(self.logcat_id):grid.SetCellValue(i,0,str(id))grid.SetCellValue(i,1,self.logcat_name[i])grid.SetCellValue(i,2,self.logcat_datetime[i])Pass

(2)关闭日志

def OnCloseLogcatClicked(self,event):self.SetSize(920,560)self.initGallery()Pass

4.系统性能测试和分析

4.1.框架界面

4.2.宿舍管理
(1)人脸录入




(2)删除人脸


4.3.监测人员
4.4.查看日志
监测、查看

上面是主要功能的相关代码,由于代码量有点大所以就没有全部写出来,如有需要请看这里

基于人脸识别的宿舍门禁系统相关推荐

  1. 人脸识别测温门禁系统在疫情防控中的应用

    中国第一例新冠肺炎患者于2019年12月1日出现症状,到现在已经将近过去一年了.疫情的反弹总是无时无刻的在牵动着大众的心.据天津市人民政府新闻办公室官方微博消息,11月20日凌晨2时5分,记者从市疾控 ...

  2. 人脸识别 宿舍门禁系统(python qt opencv带数据库)

    制作过程 最新更新 其他版本基于retinaface,卷神经网络余弦相似度人脸匹配 本文章版本预览 点击下载源代码 视频效果 一.界面设计 使用Qt Designer(源代码内有设计文件ui): 二. ...

  3. python人脸识别门禁系统毕设_人脸识别 宿舍门禁系统(python qt opencv带数据库)

    源代码人脸识别宿舍门禁系统(pythonqtopencv带数据库)-深度学习文档类资源-CSDN下载​download.csdn.net 视频效果[video(video-16ReW6hG-16059 ...

  4. 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)

    目录 一.项目功能 二.视频 三.原理图 4.材料选择 5.部分程序 资料下载地址:基于STM32的多功能门禁系统 一.项目功能 1.AS608指纹解锁:可以录入.删除.验证指纹: 2.密码解锁:可以 ...

  5. 人脸测温门禁 传感器_艾力奋人脸识别测温门禁一体机系统 展会智能闸机人员管理...

    艾力奋人脸识别测温门禁闸机: 结合客户需求自主研发动态人脸识别身份证核查系统.集现场人脸采集.身份验证.黑名单预警.等功能为一体,从读取身份证信息到现场采集人脸照片.进行比对.并获取结果,全程自动化, ...

  6. Android园区部队人脸识别源码门禁项目讲解

    Android园区部队人脸识别源码门禁项目讲解 这边搞人脸识别相关项目有一段时间,今天抽时间讲述一个经典的人脸识别项目:部队人脸识别门禁系统. 大家都知道部队对人员管理安全要求是相当高的,很多保密的技 ...

  7. 人脸识别测温门禁一体机

    人脸识别体温检测一体机采用瑞芯微RK3288高性能硬件平台,搭载工业级双目摄像头和人脸活体识别技术,以及红外热成像模块,并支持身份证读卡器.国康码,海曼测温头等多种外设扩展,实现非接触式人体温度快速检 ...

  8. Springboot毕设项目基于人脸识别的智能门禁及考勤系统11f4gjava+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目基于人脸识别的智能门禁及考勤系统11f4gjava+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8. ...

  9. SSM毕设项目基于人脸识别的景区人数统计系统zzr18(java+VUE+Mybatis+Maven+Mysql)

    SSM毕设项目基于人脸识别的景区人数统计系统zzr18(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HB ...

  10. 基于MSP430单片机的简单门禁系统

    一.课设选题 基于MSP430单片机的门禁 二.选题介绍 门禁系统通过6位密码的键入,然后与设定密码比较,若相同,门开启(电动机转动),同时人数计数器加一.若不同,按AC键清零,重新键入密码. 三.课 ...

最新文章

  1. asyncio 回调
  2. U2NET目标显著性检测,抠图去背景效果倍儿棒
  3. centos7 怎么封装自己的镜像_「10」-CentOS7.5(1804)
  4. 牛津英语3a_空中课堂 | 牛津英语学霸笔记3A M3U2
  5. 8位移位寄存器和优先编码器
  6. 无线ap软件_无线WIFI网络干扰优化,不懂必看!新手在家里也能用的网络知识
  7. 用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小.ppt...
  8. 总结几种常用的安全算法
  9. jstat分析JVM内存
  10. Solidity API
  11. python小结_Python小结
  12. 服务器上安装python anaconda最简明教程
  13. PlatformIO开发STM8S003F3P6
  14. 13首唐诗五律,哪个是你心目中的“五律”第一?
  15. Knn算法之手写识别系统
  16. Python输出 计算器 !
  17. 对Git用户名与Github账户关系的理解
  18. [FreeCodeCamp笔记] Python 数据结构和算法1 二分搜索 Binary Search
  19. 2022年第十二届APMCM亚太杯1月增赛E题思路分享
  20. 小米电视怎么看电视台节目?小鲸电视免广告,老人看电视没烦恼

热门文章

  1. 读取xlsx文件错误
  2. Python小例子 | 如何将多张图片合成mp4视频格式,并加入背景音乐...
  3. Mybatis 批量更新运行异常,数据库 postgres
  4. linux qemu的使用教程,详解QEMU网络配置的方法
  5. Priceline拥有五个子品牌分别是:Booking.com、Priceline.com、Agoda、Kayak 以及Rentalcars
  6. PNG图像转ICO的方法
  7. 2022-2028年中国粮食物流行业市场发展调研及未来前景规划报告
  8. 微信语音java_java微信企业号开发之发送消息(文本、图片、语音)
  9. GNSS中美国GPS系统与中国北斗导航系统在定位原理上的不同之处? GPS的绝对定位和相对定位是什么,哪一种定位是本课程要讲解的重点? GPS测量控制网属于哪一种?(GNSS测量与数据处理第一周作业)
  10. 计算机硬件系统实验教程代码,计算机硬件系统实验教程