问题
前段时间遇到一个传统食品企业考勤数字化转型,购买了海康和企业微信联名的考勤机,考勤设备通过互联网萤石协议接入企业微信,实现员工基础信息和人脸照片下发到设备,最终实现人脸打卡。
企业微信录入&后台导入
企业微信支持两种人脸录入方式,一种是原生的方式需要管理员和员工同时在设备前,管理员手工点击录入,设备弹出采集页面,然后员工露出人脸,设备完成采集,这种方式特别麻烦,只能是和同地考勤的小企业。因此,企业微信授权设备厂家自行开发员工自助小程序,用于员工自己通过企业微信小程序进行手机前置摄像头的自助采集。
除了以上两种移动端APP的操作以外,考虑到企业存量的员工照片,还提供了根据姓名从后台导入员工图片的方式。
以上三种方式基本能够完成98%企业的需求,但是经过多次反复沟通发现该企业还是存在以下特殊情况:1、普通员工年龄偏大,普遍50+,文化程度偏低,手机存在大量的非智能功能机没办法安装企业微信 2、负责管理人员入职的人事部分,对电脑使用也不熟练,人员流动量大,每天需要处理30+员工入职。因此,企业只能让车间负责人拍摄员工的照片用以后台导入。
自己接的坑
接下去问题的重点来了,因为比较紧急,我答应该企业获得该企业的授权后加入企业微信通讯录中作为临时管理员,协助处理图片导入事宜。第一批次拿到的图片就有很多问题,图片全是全身照,图片普遍都很大,背景也比较杂乱,部分人员还带着口罩。接着,不同车间的第二批次,第三批次陆续通过微信发送过来。如果一张张图片用截图工具截取面部位置,可能要干一个月,找了公司内网工具平台也没找到可以进行图片清洗处理的工具(这么通用的工具为什么都没人编写,不可思议)。这时候我已经有点后悔,该死的责任感,我为啥要应承这个事情,我可不是售后啊。
怎么填坑
虽然我现在是产品经理,但是3个月未转岗前我还是JAVA程序员吧,外加半桶水Python程序员,数据处理必须自动化!!!!。因此经过短暂的搜索+研究,我果断选定图片处理库更全,编写更简单的Python语言作为图片处理工具开发语言。
主要思路
- 遍历文件夹下的jpeg图片
- 通过face_recognition库识别图片的人脸图坐标(此时集中在人脸位置,不是证件照大小,可读性差)
- 一步步调试重新计算需要截取的图片坐标,裁剪图片
- 调整截取的图片分辨率(设备的芯片内存有限,不是所有设备都支持好几M的图片进行解析的)
- 保存图片到另外的目录,保持图片名称不变,方便导入
代码片段
思路确定了之后,就剩码农上身。安装好Python安装环境之后,啪啦啪啦一顿输出如下
# 支持处理一张图一个人脸的情况 多人的只处理识别到的第一个
# 定义文件路径
sourcepicFolder = u'E://source'
despicFolder = u'E://dest'
# 遍历文件夹中的所有jpg文件
image_files = [os.path.join(sourcepicFolder, file) for file in os.listdir(sourcepicFolder) if
file.endswith('.jpg')]
print('size is ', len(image_files))
for imagefile in image_files:
shortname = os.path.basename(imagefile)
fotmate = Image.open(imagefile)
print(shortname + ' started')
try:
# 读取证件照片
img = cv2.imdecode(np.fromfile(imagefile, dtype=np.uint8), cv2.IMREAD_COLOR)
# 检测人脸位置
locations = face_recognition.face_locations(img)
if not locations:
print(shortname + ' face not found')
continue
# 获取人脸位置坐标
top, right, bottom, left = locations[0]
# 宽度每边增加脸部宽度1/5 高度每边增加脸部宽度1/3
----此处代码见下载资源
# 计算人脸宽度和高度
width = right - left
height = bottom - top
# 根据人脸位置裁剪图片
face_img = img[top:bottom, left:right]
# 调整人脸图片分辨率大小
face_img_resized = cv2.resize(face_img, (352, 432))
# 保存结果图片
cv2.imencode('.jpg', face_img_resized)[1].tofile(despicFolder + '/' + shortname)
cv2.waitKey(0)
print(shortname + ' finished')
print(' -----------------------------------------------------')
except Exception as e:
print(shortname + ' error ,not real jpg, check pic content with notepad++ ',e)
continue
完整脚本下载地址(谢谢支持)
https://download.csdn.net/download/chenzeyi_java/89267371