用Python复刻复旦大学博士关于核酸检测的ocr功能

事情背景

,简单来说,就是复旦大学需要开展全员核酸检测,而辅导员要收集学生的“健康云”截图,并挨着查看是否参加核酸。然后这位李小康博士大佬用OCR和正则表达式提取出截图里的关键字导出到Excel里。

原文:
https://mp.weixin.qq.com/s?__biz=MjM5OTUwMzIwMQ==&mid=2651401722&idx=1&sn=cead758149bc1906c9ea3912742aa07c&scene=21#wechat_redirect

在这里插入图片描述

新闻报道出来之后,不同的人有不同的言论和见解。这里不多说,仁者见仁智者见智。
我挺喜欢这种学以致用的氛围的。
因为我一直坚持:学习不只是学习,学习是为了解决问题。

废话不多说。斗胆复刻一下。作为刚学Python没多久的小萌新,实现了一个小功能,也算是一种精神激励吧。

我这个复刻版跟原版的不同点:
1、ocr不知道人家用的什么技术。我这里用的是百度ocr。有免费额度。自己注册个账号就行。百度智能云:https://cloud.baidu.com/?from=console
2、正则表达式,文章中说用到了正则表达式,而我是一个怎么都学不会正则表达式的人,决定放弃正则。
3、我在北京,只用过北京健康宝,跟健康云不一样。所以ocr的内容也不一样。

所以,按我的实际情况,

实现思路如下:

1、把截图收集好了,放到文件夹下。我这里只有两张图片。
在这里插入图片描述
在这里插入图片描述

2、用百度ocr识别(百度智能云,通用文字识别(标准版)https://cloud.baidu.com/doc/OCR/s/zk3h7xz52)
3、解析返回的数据
4、用pandas写入表格

具体代码:

# encoding:utf-8
import os
import requests
import base64
import pandas as pd


def get_token():# 获取access_token,必要的步骤。没这个token百度就不让你用
    api_key = 'XXXXXXXXXXXXX'# 从百度智能云获取
    Secret_Key = 'XXXXXXXXXXXXXX' #从百度智能云获取
    host = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={api_key}&client_secret={Secret_Key}'
    response = requests.get(host)
    access_token = response.json()['access_token']
    return access_token

def do_ocr(file_name):#定义ocr识别的方法。并返回识别出来的内容
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    # 二进制方式打开图片文件
    f = open(rf'D:\code\练手\百度OCR\健康宝\images\{file_name}', 'rb')
    img = base64.b64encode(f.read())

    params = {"image": img}
    access_token = get_token()
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print(response.json())
        user_name = response.json()['words_result'][0]['words']
        user_result = response.json()['words_result'][1]['words']
        user_org = response.json()['words_result'][7]['words']
        user_time = response.json()['words_result'][-1]['words']
        print(user_name, user_result, user_org, user_time)
        return user_name, user_result, user_org, user_time

if __name__ == '__main__':
    file_list = []
    path = r'D:\code\练手\百度OCR\健康宝\images'
    for i in os.listdir(path):
        file_list.append(i)

    result_list = []
    for i in file_list:
        result = do_ocr(i)
        xingming = result[0]
        jieguo = result[1]
        org = result[2]
        time = result[3]
        result_list.append([xingming, jieguo, org, time])
    df = pd.DataFrame(result_list, columns=['姓名', '结果', '机构', '时间'])
    df.to_excel(r'D:\code\练手\百度OCR\健康宝\result.xlsx', index=False)

标题最终得到的Excel结果:

在这里插入图片描述

这个代码其实还是有几个问题的。
1、ocr识别的内容,可能会存在返回参数个数的差异(百度api的锅,解决不了)。比如我要识别的两张图,图1返回值有8个,图2返回值有9个,而我是用下标进行取值的,这样的话,参数不一致会导致用下标取值出现取值错误。
计划使用小算法,进行更正。To Be Continue…
2、对截图要求较高,出现其他干扰文字,会导致识别结果出现问题。

后续需改进,这次就先到这里。起码先实现了简易版的功能。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值