0

0

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格

P粉084495128

P粉084495128

发布时间:2025-07-31 15:07:19

|

1015人浏览过

|

来源于php中文网

原创

该项目针对OCR识别签到记录时的形近字误判问题,提出“用错误打败错误”方案。通过PaddleOCR识别签到截图中带绿色对勾的姓名,生成花名册中姓名的图片并OCR识别,将两者结果匹配,解决如“佘大”被误判为“余大”的问题,实现一键统计签到并生成电子表格,提升效率。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格

项目背景

懒人打卡统计:用OCR+花名册一键统计打卡结果

出席各种会议或活动时均需要进行签到,有的时候是纸质的签到表,有时候则是APP打卡,之后再人工将签到信息填入EXCEL表格中。为了避免人工操作,可以通过PaddleHub调用OCR模型,一键识别照片或者截图中的签到人姓名,并且通过字符匹配的方式,找到excel表格中的签到人进行标注。

OCR识别模型中的弊端

但OCR模型+字符匹配的方式会导致“误判”的情况发生,从而无法正确统计信息,例如:用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

“佘(she)大”同学按时出席并签到后,机器识别很有可能会识别为“余(yu)大”,从而无法在花名册excel文件中找到“佘(she)大”同学,最终“佘(she)大”同学每次都有旷到记录。

为了解决这个问题,可以利用**“错误”打败错误**。首先,生成包含“佘(she)大”同学姓名的图片A,进行识别。而后,将图片A的识别结果和签到表截图的识别结果进行匹配。如果匹配成功,则意味着“佘(she)大”同学签到成功。

具体介绍

懒人打卡统计:用OCR+花名册一键统计打卡结果

如下所示,对于这样的app打卡内容,如果人工找到打卡人姓名(带✔的方框),再在excel中将对应日期的对应姓名的同学标注为打卡成功会花费大量时间,影响我们打游戏。

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

解决方案

为了能一键完成工作安排,继续快乐打游戏,不妨试试PaddleOCR吧:

  • 使用OCR模型识别姓名的位置
  • 按照姓名的位置锚定右上角的绿色对勾
  • 将csv中带有绿色对勾的姓名的标注改为1

为了保护同学们的姓名隐私不在项目中提供截图对应的 打卡截图,花名册文件,仅提供一个随意生成的案例图片,花名册和代码

塔猫ChatPPT
塔猫ChatPPT

塔猫官网提供AI一键生成 PPT的智能工具,帮助您快速制作出专业的PPT。塔猫ChatPPT让您的PPT制作更加简单高效。

下载

截图界面为微信小程序:接龙管家的打卡记录界面

由于手机型号/分辨率各有差别,使用本代码请务必对以下参数进行设定

img_dir='1.jpg'                        # 打卡截图name_csv='name_csv.csv'        # 花名册文件,表头为(name,1,2,3,4,5,6,7...),对应的内容分别为姓名,第一天的打卡结果,第二天的打卡结果...,其中姓名填入即可,其他方格可以留空save_dir='output.csv'               # 打卡后的结果保存路径block_size=25                          # 右上角的绿色对勾的区域大小w_bias=35                                # 绿色对勾相对于姓名位置的横向偏移量h_bias=-50                                # 绿色对勾相对于姓名位置的纵向偏移量threshold=175                         # 阈值,低于此阈值则为绿色,否则则偏向于灰色,可以根据像素点均值进行分类clock_in_col=1                          # 打卡条目,此处设为1对应第一天的打卡结果,结果会写入到第二行中

       

打卡前后截图示例

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

用错误打败错误

为了解决OCR识别模型将形近字误判从而导致无法正确生成签到电子记录的情况发生,可以通过以下步骤生成签到人的“伪姓名”从而使用“伪姓名”获得正确的匹配结果。

下表以“佘大”同学的签到检测作为示例: 用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

可以看到通过这种生成“伪姓名”方式,就可以顺利地将“佘大”同学和签到表截图中地姓名匹配上啦~

代码逻辑

  1. 获取签到结果截图的OCR识别结果
  2. 获取花名册excel中第i个同学的姓名
  3. 通过上述方法生成“伪姓名”
  4. 将“伪姓名”和OCR识别结果匹配,若有匹配项,且签到标记存在,则对应同学签到成功,若否则签到失败
  5. i=i+1, 跳到第2步执行

代码

In [ ]
!pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
!pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple
!pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple 
!pip install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple
   
In [ ]
import cv2import paddlehub as hubimport pandas as pdimport numpy as npfrom PIL import ImageFont,ImageDraw,Image# 定义参数# define some parametersimg_dir='案例.jpg'             # 打卡截图name_csv='案例.csv'     # 花名册文件,表头为(name,1,2,3,4,5,6,7...),对应的内容分别为姓名,第一天的打卡结果,第二天的打卡结果...,其中姓名填入即可,其他方格可以留空save_dir='输出案例.csv'       # 打卡后的结果保存路径block_size=25               # 右上角的绿色对勾的区域大小w_bias=35                   # 绿色对勾相对于姓名位置的横向偏移量h_bias=-50                  # 绿色对勾相对于姓名位置的纵向偏移量threshold=175               # 阈值,低于此阈值则为绿色,否则则偏向于灰色,可以根据像素点均值进行分类clock_in_col=1              # 打卡条目,此处设为1对应第一天的打卡结果# 导入文字识别模型# ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")ocr = hub.Module(name="chinese_ocr_db_crnn_server")# 读取测试文件夹test.txt中的照片路径img=cv2.imread(img_dir)
np_images =[img] 

results = ocr.recognize_text(
                    images=np_images,         # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
                    use_gpu=False,            # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量
                    output_dir='ocr_result',  # 图片的保存路径,默认设为 ocr_result;
                    visualization=True,       # 是否将识别结果保存为图片文件;
                    box_thresh=0.8,           # 检测文本框置信度的阈值;
                    text_thresh=0.8)          # 识别中文文本置信度的阈值;# 匹配文字与识别结果# the function make codes shorterdef is_name_in_ocr(name,ocr_result):
    for item in ocr_result[0]['data']:        if item['text']==name:            return True, item['text_box_position']    return False,None# 根据指定文字生成图片并用ocr模型识别def generate_name_and_ocr(name,ocr):
    w=200
    h=100
    img = np.full((h,w,3),fill_value=255,dtype=np.uint8)
    fontpath = "simhei.ttf" #导入字体文件
    b,g,r,a = 0,0,0,0 #设置字体的颜色
    font = ImageFont.truetype(fontpath,30)#设置字体大小
    img_pil = Image.fromarray(img)#将numpy array的图片格式转为PIL的图片格式
    draw = ImageDraw.Draw(img_pil)#创建画板
    draw.text((w/2-10,h/2-20),name,font=font,fill=(b,g,r,a))#在图片上绘制中文
    img = np.array(img_pil)#将图片转为numpy array的数据格式
    results = ocr.recognize_text(
                    images=[img],         # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
                    use_gpu=False,            # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量
                    output_dir='ocr_result',  # 图片的保存路径,默认设为 ocr_result;
                    visualization=True,       # 是否将识别结果保存为图片文件;
                    box_thresh=0.8,           # 检测文本框置信度的阈值;
                    text_thresh=0.8)          # 识别中文文本置信度的阈值;
    return results[0]['data'][0]['text']# 检索识别框右上角的绿色方块,如果存在则打卡成功df=pd.read_csv(name_csv,encoding='gbk')for i in range(len(df)):
    name=df.iloc[i,0]
    name=generate_name_and_ocr(name,ocr) # 注释此行代码可以看到 案例 中的佘大同学签到失败了
    flag, text_box=is_name_in_ocr(name,results)    if flag:
        center_point=[(text_box[2][0]-text_box[0][0])/2+text_box[0][0],(text_box[2][1]-text_box[0][1])/2+text_box[0][1]]
        center_point=[int(x) for x in center_point]
        check_img=img[center_point[1]+h_bias:center_point[1]+h_bias+block_size,center_point[0]+w_bias:center_point[0]+w_bias+block_size,:]        # print(name,check_img.mean())
        if check_img.mean()
    

相关专题

更多
微信是谁开发的
微信是谁开发的

微信是由张小龙所带领的腾讯广州研发中心产品团队打造开发的,并不是马化腾开发的,而腾讯公司总裁马化腾是在产品策划的邮件中确定这款产品的名称叫做“微信”的。想了解更多微信相关的内容,可阅读本专题下面的相关文章。

3748

2024.11.05

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

1392

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

405

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

561

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1243

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

367

2023.08.02

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

4521

2023.08.09

java导出excel
java导出excel

在Java中,我们可以使用Apache POI库来导出Excel文件。本专题提供java导出excel的相关文章,大家可以免费体验。

407

2023.08.18

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

2

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 13万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

PHP课程
PHP课程

共137课时 | 9.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号