通过python对纸质签到表进行统计
单位取消了刷脸签到,改用纸质签到。不幸交由我负责,更不幸还要求对签到情况进行统计。签到人员六十几人,一天四张签到表,一个月下来就非常多,人工统计太低效和浪费人了。网上找了一圈没找到合适方式,所以愤而写了这个小工具,把我从枯燥工作中解放。
Github地址:https://github.com/caspiankexin/small_python_program
Gitee地址:https://gitee.com/caspiankexin/small_python_program
1.确定思路
先上签到表示例
签到表虽多,但为统一格式大小,且人员长久不会变动。
- 首先将所有签过的签到表扫描为jpg格式图片。
- 先将每页的所有签字部分切割出来,放在此签到表的文件夹下,并有规律的命名。
- 判断每个切割的小图中黑色的占比,达到一定比例说明此处已签到。
- 通过一定顺序打开、切割和识别图片,加一或加零,来进行统计多张签到表。
2.程序编写
2.1得到文件夹下所有签到图片的路径
def all_file_names(path):
file_names = os.listdir(path) # 得到文件夹下的所有文件名称
file_paths = [path + '/' + str(i) for i in file_names] # 得到文件夹下的所有文件的路径地址
return file_paths
2.2确定位置,将签字处切割并保存,返回小图的路径
def cut_one_original_file(file_path):
#打开一张图
img = Image.open(file_path)
img_size = img.size
H = img_size[1] # 图片高度
W = img_size[0] # 图片宽度
# 不变的签名框的尺寸大小
w = 0.078597 * W
h = 0.019047 * H
parameter_p = 0
# 确定列数columns和行书rows
columns = range(3)
rows = range(22)
for column in columns:
x = ((375 + (414 * column))/1654) * W # 选定区域的的左边距位置,同一列的情况下,x不变
for row in rows:
y = ((335 + (81 * row))/2338) * H # 选定区域的上边距位置
region = img.crop((x, y, x + w, y + h)) # 选定区域的x、y轴初位置,以及末位置
parameter_p = parameter_p + 1
parameter_p_n = parameter_p +10 # 以11为起始,对切割的小图进行排序,以列从上往下进行排序
file_path_parameter = file_path[:-4] # 创建以需要处理的签到表图片命名的文件夹,
if not os.path.exists(file_path_parameter): # 判断文件夹是否存在,如果不存在就创建
os.mkdir(file_path_parameter)
region.save(file_path_parameter + '/' + str(parameter_p_n) + ".jpg") # 将切割的小图
processed_path