目录
服务器打卡函数实现
签到验证检测
百度人脸识别复用
总结
服务器打卡函数实现
打卡函数的主要工作流程如图所示。当启动开始签到后,调用打卡签到响应函数,启动人脸采集设 备,然后与百度人脸库注册的人脸进行对比,如果用户存在,返回用户姓名,并获取当前打卡时间,与 考勤设定时间进行对比,然后将姓名、工号和考勤信息写入到数据库;如果用户不存在,返回“打卡失 败”提示信息。
由“开始签到”的响应函数调用,实现代码如下。
定义“开始签到”响应函数OnStartPunchCardClicked,代码实现如下。
def OnStartPunchCardClicked(self,event):
self.start_punchcard.Enable(False)
self.end_puncard.Enable(True)
self.loadDataBase(2)
_thread.start_new_thread(self.punchcard_cap,(event,))
pass
签到验证检测
签到验证主要用于实现对用户考勤状态的管理和查阅,读取存储到本地数据库的考勤状态信息,并在可 视化界面显示,主要由3个函数实现,一是数据库加载函数loadDataBase();二是查看考勤日志响应函数 OnOpenLogcatClicked();三是关闭日志响应函数OnCloseLogcatClicked()。
数据库加载函数loadDataBase的实现如下所示,结合上节课中SQLite的python操作方法实现:
import sqlite3
def loadDataBase(self,type):
conn = sqlite3.connect("inspurer.db") # 建立数据库连接
cur = conn.cursor() # 得到游标对象
if type == 1:
self.knew_id = []
self.knew_name = []
self.knew_face_feature = []
cur.execute('select id,name,face_feature from worker_info')
origin = cur.fetchall()
for row in origin:
print(row[0])
self.knew_id.append(row[0])
print(row[1])
self.knew_name.append(row[1])
print(self.convert_array(row[2]))
self.knew_face_feature.append(self.convert_array(row[2]))
if type == 2:
self.attend_id = []
self.attend_name = []
self.attend_time = []
self.attend_state = []
cur.execute('select user_id,user_name,sign_in_time,checking_statefrom attendance')
origin = cur.fetchall()
for row in origin:
print(row[0])
self.attend_id.append(row[0])
print(row[1])
self.attend_name.append(row[1])
print(row[2])
self.attend_time.append(row[2])
print(row[3])
self.attend_state.append(row[3])
pass
查看考勤日志响应函数OnOpenLogcatClicked()的实现如下所示,需要输出显示工号、姓名、打卡时间、 是否迟到等信息。
import wx
def OnOpenLogcatClicked(self,event):
self.loadDataBase(2)
grid = wx.grid.Grid(self,pos=(320,0),size=(600,500))
grid.CreateGrid(100, 4)
for i in range(100):
for j in range(4):
grid.SetCellAlignment(i,j,wx.ALIGN_CENTER,wx.ALIGN_CENTER)
grid.SetColLabelValue(0, "工号") #第一列标签
grid.SetColLabelValue(1, "姓名")
grid.SetColLabelValue(2, "打卡时间")
grid.SetColLabelValue(3, "是否迟到")
grid.SetColSize(0,100)
grid.SetColSize(1,100)
grid.SetColSize(2,150)
grid.SetColSize(3,150)
grid.SetCellTextColour("NAVY")
for i,id in enumerate(self.logcat_id):
grid.SetCellValue(i,0,str(id))
grid.SetCellValue(i,1,self.attend_name[i])
grid.SetCellValue(i,2,self.attend_time[i])
grid.SetCellValue(i,3,self.attend_state[i])
pass
关闭日志响应函数OnCloseLogcatClicked()如下所示。
def OnCloseLogcatClicked(self,event):
self.initGallery()
pass
百度人脸识别复用
介绍了人脸识别的实现过程,主要包括人脸注册和人脸搜索2个步骤,在此项目中,我们 需要对人脸注册和人脸搜索进行封装,实现对人脸识别各模块的复用。当新用户进行注册录入时,调用 人脸注册模块;当进行打卡签到时,调用人脸搜索模块,将打卡用户的人脸图像在人脸库中搜索,如在 人脸库中存在,返回用户姓名,如不存在,用户姓名为空。
人脸注册模块的封装,基本流程是采集人脸图像,注册至人脸库,注册成功返回True,否则,返回 False。
import requests
import base64
def face_register(path,user_id):
f = open(path,'rb')
image = base64.b64encode(f.read())
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add"
params = {'image':image,
'image_type':'BASE64','group_id':'vip','user_id':user_id,'quality_control':'LOW'
}
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
if response:
return True
else:
return False
人脸搜索模块的封装,基本流程是读取人脸图像,搜索人脸库中图像并进行对比,如果返回值中用户对 比置信度“score”大于80,则返回该用户的“user_id”,否则返回空值。
import requests
import base64
def face_retrieve(imagePath):
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/search"
f = open(imagePath,'rb')
image = base64.b64encode(f.read())
params = {'image':image,
'image_type':'BASE64','group_id_list':'vip','quality_control':'NONE'}
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
if response:
result = response.json()
if result['result']['user_list'][0]['score'] >= 80:
name = result['result']['user_list'][0]['user_id']
else:
name = " "
return name
总结
本节课我们学习了服务器打卡函数实现, 签到验证检测,百度人脸识别复用的相关内容。下节课我们将学习实现所以项目需要的软件的安装的相关内容。我会带着大家一起完成人脸识别打卡项目的所有内容。