【class14】创建自己的OCR系统

【class14】

上节回顾

在上节课中,我们主要了解了OCR的实现原理。
简单来说,OCR技术就是提取文档/图像中的文字。

接下来我们将进入实战,搭建属于自己的OCR系统~
为了更高效地学习,我们分为以下几步完成:
1. 读取图像文件
2. 接入百度智云文字识别服务
3. 调用通用文字识别
4. 提取文字识别信息
5. 写入文本文件

1. 读取图像文件

如图,我们随机选择一张试题图像,保存路径为"/Users/ocr/test.png"。

接着,直接打开并读取刚刚保存的这张图像。使用 with...as 配合open函数以rb 方式,打开路径为filePath的图像
调用 read() 函数,读取图像中的内容。

# 将照片路径'/Users/ocr/test.png'赋值给变量filePath

filePath = '/Users/ocr/test.png'

# 使用with...as以rb方式,打开路径为filePath的图片并赋值给f

with open(filePath, 'rb') as f:

    # 使用read()读取f,赋值给变量image

    image = f.read()

    # 使用print()输出变量image

print(image)

关于read的一点拓展

Python 中,read()readline(),  readlines() 是用于读取文件内容的三种不同的方法。

  1. read():
    1. read() 方法用于从文件中读取指定数量的字节。如果未指定字节数量,则默认读取整个文件内容。
    2. 返回一个包含文件内容的字符串。
  2. readline():
    1. readline() 方法用于从文件中读取一行内容,并返回一个字符串。每次调用该方法时,它会读取文件中的下一行。
    2. 当读取到文件末尾时,readline() 方法会返回一个空字符串。
  3. readlines():
    1. readlines() 方法用于从文件中读取所有行,并将其存储在一个列表中。每个列表元素对应文件中的一行。
    2. 返回一个包含文件内容的列表,每个元素是文件的一行内容。

下面是这三种方法的简单示例用法:

# 假设有一个名为 "example.txt" 的文本文件,内容如下:

# Hello, World!

# This is a test file.

# Python is awesome.

# 使用 read() 方法读取整个文件内容

with open("example.txt", "r") as file:

    content = file.read()

print(content)

# 使用 readline() 方法逐行读取文件内容

with open("example.txt", "r") as file:

    line = file.readline()

    while line != "":

        print(line.strip())  # 删除行尾的换行符

        line = file.readline()

# 使用 readlines() 方法读取所有行,并存储在列表中

with open("example.txt", "r") as file:

    lines = file.readlines()

    for line in lines:

        print(line.strip())  # 删除行尾的换行符

2. 接入百度智云文字识别服务

读取完图像内容,在识别文字之前,我们需要先找到一个智能识别文字的方式:
接入百度智能云文字识别服务,然后调用这个服务进行识别。
与图像识别一样,百度智能云也为文字识别提供了很多接口。
这些接口都能实现文字识别的功能。

在这里,我们「接入百度智云文字识别服务」同样只需3步:
a. 创建文字识别应用
b. 获取AppID、API Key和Secret Key
c. 创建文字识别客户端

a. 创建文字识别应用

登录已创建的百度账号。
进入【文字识别】页面以后,我们需要通过【创建应用】功能,创建一个属于我们自己的文字识别应用。

                                        

在【创建应用】页面:
1. 为你的应用设定名称;
2. 领取接口的免费额度;
3. 对应用进行简短的描述;
4. 填写完毕后,选择【立即创建】完成操作。

  

b. 获取AppID、API Key和Secret Key

创建完成后,点击「查看应用详情」就可以看到AppID、API Key和Secret Key
我们需要使用这三个ID来调用对应的API。

c. 创建文字识别客户端

在之前的项目中,我们已经安装好了 Python SDK。
现在直接导入和新建AipOcr即可创建文字识别客户端。

创建文字识别客户端

代码的作用

AipOcr是OCR的Python SDK客户端,为使用OCR的开发人员提供了一系列的交互方法。
在使用之前,我们需要先创建它。

# 从aip中导入AipOcr

from aip import AipOcr

# 将AppID"10252021"赋值给变量APP_ID

APP_ID = '10252021'

# 将API Key"ZHe7788sh11GEjIAdEKeY"赋值给变量API_KEY

API_KEY = 'ZHe7788sh11GEjIAdEKeY'

# 将Secret Key"JMMzHe7788BUSH1ZhEnM1YUEhh"赋值给变量SECRET_KEY

SECRET_KEY = 'JMMzHe7788BUSH1ZhEnM1YUEhh'

# 新建一个AipOcr,并赋值给变量client

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

3.调用通用文字识别

接下来,我们就可以调用接口来实现文字识别啦~
为了更准确、通用,这里选择「通用文字识别(高精度版)」这个接口来搭建OCR系统。

「通用文字识别(高精度版)」能更高精度地识别图片中的文字信息。
即对输入的一张图片,识别出所有的文字。

调用通用文字识别

代码的作用

这几行高亮的代码,利用「通用文字识别(高精度版)」接口,对一张输入图片,识别出所有文字。

代码:

# 3. 调用通用文字识别

# 如果有可选参数

# 创建字典options,并将可选参数detect_direction的值设置为"true"

options = {"detect_direction":"true"}

# 调用通用文字识别接口并把结果赋值给result

result = client.basicAccurate(image, options)

# 输出result

print(result)

设置可选参数

在调用接口时,规定了可选参数需要以字典的形式传入函数中,所以创建了字典options。
这里提供的可选参数有2个:
detect_direction和probability

示例中添加了参数detect_direction,将其设置为"true",就能检测图像的朝向。

待识别的图像

必选参数image,图像数据,支持jpg/png/bmp格式
要求大小不超过4M,最短边至少15px,最长边最大4096px,否则会
识别失败

调用通用文字识别

对刚刚新建的AipOcr对象--client,使用basicAccurate( )函数。
将待识别的图像必选参数image和可选参数options传入到该函数中即可。

这么多的参数当然不是每一个都需要。
我们需要的文字识别信息都存储在'words_result'中。
其他参数对我们暂时没有使用价值。

4. 提取返回结果
调用接口返回的是一个复杂的字典结构,我们将它赋值给了result。
想要从字典result中取出参数'words_result'的值,得到文字信息,可以用result['words_result']。

# 4. 提取返回结果

# 从返回结果中提取出参数words_result的值并赋值给变量ending

ending = result['words_result']

# 使用print()输出变量ending

print(ending)

参数'words_result'的值是一个列表结构,我们将它赋值给了ending。
取出列表ending的每一个元素,我们用for循环来实现。

# 4. 提取返回结果

# 从返回结果中提取出参数words_result的值并赋值给变量ending

ending = result['words_result']

# 使用for循环遍历列表ending中的每一个元素

for word in ending:

    # 使用print()输出word

prnt(word)

我们发现,列表中的每一个元素都包含参数'words'
这是因为文字识别是按照单元行(从上到下)进行的,每一行的内容都与识别结果一一对应。
它们分别存储在独立的'words'中,共同组成一个列表。

列表中的每一个元素又是一个字典,我们想要获得'words'参数中的文字信息就需要指定键'words'。

# 提取参数'words'中的文字信息

    text = word['words']

    # 使用print()输出text

print(text)

如图所示,最终我们获得了所有'words'参数中的文字信息。
这样,整个识别过程也就完成了。

5. 写入文件

最后,为了保存记录,我们试着将刚刚获得的所有文字信息写入最简单的文本文件,方便查看。

写入文件

代码的作用

写入文件和读取文件类似,同样需要先打开文件再写入。
这几行代码使用 
with...as 语句配合 open() 函数以a方式,打开了路径为test.txt的文件,并使用write()函数写入内容"这是个测试!"。

代码:

# 使用with...as以a方式,打开路径为test.txt的文件

# 并赋值给fp

with open("test.txt","a") as fp:

    # 使用write()将"这是个测试!"写入fp

fp.write("这是个测试!")

a方式

文件的打开方式用特定的字符串表示。
这里的
" a " 表示写入文件时,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾。

write()函数

对文件进行写入操作,传入的参数常为字符串格式。
这里,使用write()函数在文本中写入内容"这是个测试!"。

# 5. 写入文件

    # 使用with...as以a方式,打开路径为test.txt的文件并赋值给fp

    with open("test.txt","a") as fp:

        # 使用write()将文字信息text写入fp

        fp.write(text)

# 使用print()输出"写入完成"      

print("写入完成")

写入完成,我们打开test.txt文件发现:
所有的文字信息都连成一片,密密麻麻没有间隔。

这样既不利于我们查找也不方便阅读。
因此,我们可以在字符串后面添加换行符'\n' ,按行写入文字信息。

修改代码为:

# 使用write()将文字信息text换行写入fp

        fp.write(text+ '\n')

这样,当我们再次打开test.txt文件就可以看到:文字信息是按照识别行的顺序依次写入的啦~当然你也可以按照自己的风格,用其他符号来分隔写入的文字信息😆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636175.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【调试笔记-20240516-Windows-使用VS2019编译edk2(上)】

调试笔记-系列文章目录 调试笔记-20240516-Windows-使用VS2019编译edk2(上) 文章目录 调试笔记-系列文章目录调试笔记-20240516-Windows-使用VS2019编译edk2(上) 前言一、安装开发工具1. 安装 VS20192. 安装 Python 3.103. 安装 …

一图看懂 | 蓝卓医化行业解决方案

随着“创新药”首次出现在政府工作报告中,医药工业各个细分赛道都迎来了关键突破期,其中化学药品制剂作为所有药品中数量、品种最多的类别,也是居民日常生活中使用最广泛的类别,推动医药化工行业数字化能力,对于发展新…

uniapp宠物咖门店连锁会员制宠物寄养系统 微信小程序-

随着人们生活水平的提高,越来越多的人喜欢给自己或是家里的老人小孩养一只可爱的宠物,满足宠物的需要也就成为了许多爱宠人士每天苦恼的事情,去哪可以选购到健康合格的宠物食品?去哪能给宠物看病?去哪能给脏了的宠物美…

MongoDB基础入门到深入(七)建模、调优

文章目录 系列文章索引十一、MongoDB开发规范十二、MongoDB调优1、三大导致MongoDB性能不佳的原因2、影响MongoDB性能的因素3、MongoDB性能监控工具(1)mongostat(2)mongotop(3)Profiler模块(4&a…

气膜体育场馆的迅速发展与应用前景—轻空间

近年来,随着国家大力提倡体育运动和全民健身,国内体育场馆的数量和规模呈现出迅速扩张的趋势。气膜场馆凭借其低成本、快速建造和环保绿色的优势,成为中国体育场馆发展的重要组成部分。据《中国体育气膜白皮书》统计,截至2022年&a…

2024上海国际化工自动化仪器仪表展览会

2024上海国际化工自动化仪器仪表展览会 2024 Shanghai International Chemical Automation Instrument Exhibition 时间:2024年12月11-13日 地点:上海新国际博览中心 详询主办方陆先生 I38(前三位) I82I(中间四位…

STM32_HAL_RTC时钟

1. RTC 时钟简介 STM32F407 的实时时钟(RTC)是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器,在相对应的软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统的当前时间和日期。 RTC 模块和时钟配…

C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【三剑客和正则表达式】

文章目录 学习目标一、什么是三剑客1.三剑客grep2.三剑客sed3.三剑客awk4.正则过滤例子15.正则过滤例子2 总结 学习目标 1.学会使用 grep 2.学会使用 sed 3.学会使用 awk 4.学会使用正则表达式一、什么是三剑客 正则三剑客:grep sed awk 1.三剑客grep # 擅长过滤…

AI整体架构设计5:CN+AI的三国杀

本文最后的图展示了气势磅礴的AICN(云原生)的技术栈,潜藏着无限的杀机。还在云原生的时候,研发和运维一直围绕着Devops进行两国杀。CNAI的时代,数据科学家加入了战局,彻底变成三国杀。边界的不断互相渗透&a…

【设计模式】JAVA Design Patterns——Combinator(功能模式)

🔍目的 功能模式代表了一种以组合功能为中心的图书馆组织风格。 简单地说,有一些类型 T,一些用于构造类型 T 的“原始”值的函数,以及一些可以以各种方式组合类型 T 的值以构建更复杂的类型 T 值的“组合器” 🔍解释 真…

ubuntu20.04 10分钟搭建无延迟大疆无人机多线程流媒体服务器

1.使用效果 无人机画面 2.服务器视频端口 3.使用教程 3.1.下载ubuntu对应软件包:系统要求ubuntu16以上 3.2修改端口(config.xml文件) 3.3启动服务 目录下输入:终端启动:./smart_rtmpd 后台启动:nohup ./…

Pip,whl,源码编译安装Python库

pip安装 pip 是 Python 包管理工具,用于安装和管理 Python 包。pip 是 Python 开发中不可或缺的工具,能够帮助开发者轻松地管理项目所需的各种库和依赖。无论是安装新包、升级现有包还是卸载不需要的包,pip 都提供了简单而强大的命令来完成这…

92.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-利用哈希表实现快速读取文本内容

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

k8s dashboard安装

本案例,k8s版本为v1.22.17,所以安装v2.7.0版本的dashboard 1、下载dashboard的yaml文件 curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 2、修改recommended.yaml文件 修改定义的Service&…

java版本spring cloud-spring boot高效知识付费SaaS平台的架构与功能模块设计

知识付费平台是一种快速发展的在线教育模式,它以满足用户需求为核心,提供便捷高效的学习渠道。该平台汇聚了各类专业知识,覆盖职业技能、生活兴趣和人文社科等多个领域,满足不同用户的学习需求。同时,平台还提供视频播…

通过 PW6606 快充电压诱骗芯片,了解 USB-A 与 USB-C 快充协议

充电器一般分两种: 1, A 口充电器,就是我们常见的 USB 口,如下图,这种通用快充协议叫: QC3.0,QC2.0 快充,是属于快充刚开始的充电协议,支持 5V,9V,12V 和 20V 电压输出充电器&#x…

聚观早报 | 拼多多第一季度营收;苹果2024款彩虹表带上市

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 5月24日消息 拼多多第一季度营收 苹果2024款彩虹表带上市 小米汽车智驾将提速 iPhone 16 Pro Max将用最大屏幕 …

20240520解决在Ubuntu20.04下编译RK3588的Android12的SDK出现C2_GIT_BUILD_VERSION未定义的问题

20240520解决在Ubuntu20.04下编译RK3588的Android12的SDK出现C2_GIT_BUILD_VERSION未定义的问题 2024/5/20 20:19 缘起:通过./repo/repo/repo sync -l得到的SDK正常,但是解压缩之后的SDK却出错了! 通过grep很容易发现有三个地方有&#xff0c…