浏览量: 800 次浏览

人脸识别签到系统功能介绍

2018年9月23日 72 作者 Nie Hen

前言

基于python+face_recognition+opencv+pyqt5+百度AI实现的人脸识别、语音播报、语音合成、模拟签到系统(2)
人脸识别效果图
enter description here
演示视频:

源码在github上 https://github.com/niehen6174/Face-recognition-check-in-system
简单介绍以及需要的配置在 https://blog.csdn.net/Nirvana_6174/article/details/82824637

功能介绍

文件

ft2.py (对汉字实现转码opencv的puttxt不支持汉字需要转码)

 baiduyuyin.py这个是语音合成模块使用的是百度ai的语音合成其中的API-KEY等信息需要去百度注册获得

 voice_syn_ui.py是语音合成的一个界面,只是一个小框

 face_re_ui.py 是主界面  里面包括一些按钮和lable 进度条等主界面信息

 openui.py  是主程序 几乎所有这个项目能实现的功能都在这里
 photo文件夹用来放需要照片(需注意照片清晰度太低会识别不出人脸会报错)

 video_screenshot是用来放拍照的照片

 Amg.jpg是头像face3.jpg是背景

 mysh.ttf是一个字体文件ft2.py 需要用到

 text.txt是用来放个人的详细信息*(需要注意这里个人信息的格式按照原格式放,不然会读不出来)

 data.xls是用来记录被摄像头识别出的人(有时间 事件可以按需求修改)

1主界面

使用pyqt5构建,9个按钮 一个进度条 还有隐藏的7个lable显示信息 里面多次使用布局  为更加美观多次很多的矩形都使用黄金比例构建

实现添加背景 添加头像 改变按钮颜色等功能
详细代码看face_re_ui.py

效果图
enter description here

2打开摄像头

1.由于这个项目是基于实验室需要所做,所以在打开摄像头按钮处有三个,我所使用的摄像头是海康威视的.
2.与我电脑在同一局域网使用的是rtsp地址进行访问,对于摄像头也需要一些配置,为处理更快需要降低帧率分辨率 等。
3.如果是在笔记本上使用把self.source改成0, 同时下面使用到source的人脸识别 语音播报 录入信息到excel模块也需要把对source的判断删掉 到主界面把按钮改一下就好  (修改中如有问题可以联系)
4.打开摄像头会有两到三秒的延迟(不同性能电脑可能会不同)

  1. 使用video_source(self,num) 该函数用于连接按钮并根据按钮提供source即摄像头的rtsp地址 里面进行判断之后

  2. 传入下一个函数btn_open_cam_click(self,num) 这个函数用来判断摄像头的状态,这个函数里面还有一些对摄像头是否打开的判断来修改按钮,如果没被打开就执行下一个函数show_camera(self)  这个是打开摄像头显示画面的函数,里面也包含了进行人脸识别的函数

  3. 其中由于这个是在ui上的lable显示摄像头画面,opencv 读取图片的样式,不能通过Qlabel进行显示,需要转换为Qimage QImage(uchar * data, int width,在代码140行左右。

(摄像头参数配置)
enter description here

3拍照
  1. 拍照时打开摄像头以及进行人脸识别时都可以进行的,会弹出一个确定的提示框,由于学python不是太好多线程还没学好,这里并不是多线程,点击拍照的时候视频会停。(有时间去好好学学多线程再进行修改)
    1. 照片会以时间命名,放到video_screenshot文件夹中。

    2. 代码在 photo_face(self) 函数中,前提是摄像头打开的状况下。把当前的一帧图像获取出来并以时间命名(获取时间转换成字符串)

enter description here

4人脸识别

1.语音播报和记录人脸信息都是基于人脸识别进行的,
2.首先有个进度条progressbarr_move(self);timerEvent(self, e)两个函数,
3.使用的是python的一个库face_recognition 进行识别,使用opencv打开,人脸识别模块中,
4.加载图像,图像在一个photo文件夹中,获取face_encoding脸部信息,如果图像没有人脸信息此时会报错,然后会进入处理视频画面的while循环 对每帧图像进行处理,当找到人脸的时候开始进行匹配,会把每帧图像找到的人记录下来,放到一个集合中去,
5.调用这个函数show_picture(self)在人脸识别的右边显示 识别出来人的详细信息姓名年龄等,这些信息是提前录入的,
6.再使用write_record(self):函数,进行对每次获取的人处理记录到一个excel中去,
7.然后再进行对人脸进行标框显示汉字226行左右,这部分是核心功能,代码量比较大,涉及到的东西用到的知识也是比较多,也有部分原因是我python学的不是很精,一些代码处理的不够短小。

enter description here

  1. 进度条是一个假的进度条并不是能够显示真正的进度,而是对时间的处理对值的一些限定判断从而实现类似进度条的效果。

  2. 获取文件夹中人脸信息部分,使用对字符串的处理能够实现,自己提取出名字放入集合,使用循环遍历文件夹中的照片人脸信息。

  3. show_picture(self)函数中从text.txt文件中提取出来每个人的信息,进行和从图像中找到的人脸进行匹配,匹配成功的会在右侧lable显示那个人的照片和详细信息,显示信息和显示图片的lable是独立的但是在调用的时候是一块调用显示,结束之后有一个qingping()函数进行清屏,

  4. write_record(self):函数能够把摄像头看到的人脸都记录到表格中去,从而能够达到模拟签到,由于每帧获取到的人脸可能会不同,所以需要对集合 元祖的处理达到记录的人脸不重复不遗漏。然后还有对excel的操作,打开读写的操作使用xlutils.copy库,具体对excel的写入看代码。

  5. 人脸标框汉字显示,人脸标框是使用opencv 实现,汉字显示名字是使用了ft2这个转码的文件实现,因为opencv的puttxt不支持汉字输入,然后再进行opencv呈现到lable 的一些转换.

5语音合成 语音播报
  1. 语音合成代码在baiduyuyin.py 使用的是百度ai的语音合成模块。这个需要到百度AI上面注册创建一个活动,获取APP-ID等信息用于验证,这个地方电脑需要联网,用于验证信息的正确性。

  2. Openui.py中语音合成是第二个ui界面,一个输入框两个按钮,输入信息到输入框点击合成,会获取到输入的信息并调用语音合成模块生成音频打开音频,点击关闭,会关闭页面同时结束播放音频的软件。(播放音频我这里使用的是系统打开音频,推荐软件potplayer)

  3. 语音播报是一个单独的按钮,会把出现过摄像头的人的姓名都以语音合成的形式播放出来,使用到的集合跟录入到excel中的集合类似。

enter description here

6录入信息

这里点击录入信息按钮,会打开文件打开框,直接打开的是照片的文件夹,返回上一级找到text.txt是放详细信息的文本。该项目录入信息只要放入该人的照片到photo文件夹中以人名命名图片后缀为jpg,详细信息放到text.txt文本,并按原格式放入(当时学的python还没学到文件处理那块,所以用的是一种很麻烦的方法放信息)

7查看记录

在人脸识别模块中记录下来的识别出的人的信息放集合中,write_record(self)函数中有详细的代码,对集合的处理保证获取到的信息不会重复,不会遗漏。里面有对excel的操作实现写入数据,实际使用的不是直接在原文件上面写而是把原文件的信息复制下来新建一个文件名一样的文件复制到里面,再向这个新文件里面写入数据。

enter description here

目前存在的漏洞:

记录信息那块不是很完善,逻辑错误会尽快改掉;显示详细信息那块lable上的照片删不掉目前还没找到解决办法,应该尝试换种清理lable的方法;代码里面如果操作失误没有相关的提示信息(因为这个很多地方都需要完善需要去考虑)

else

写这个代码的时候python学的还不是很好,使用到的一些语句以及方法都不是很好,需要去完善,还会更新,下一步可能会使用face++的人脸识别模块,face_recognition不是很稳定

其他人脸识别模块介绍  访问链接

如有问题,或有什么建议可加群:894243022或发邮箱1639206518@qq.com 
使用本文章或代码还请声明。 

写于 2018-09-23 21:19:57
原文地址