SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

基于Pythonista和百度API的高精度文本识别脚本

发表于 2020-02-06 更新于 2021-10-29 分类于 计算机 , 技术 , Python 阅读次数: Valine:
本文字数: 5k 阅读时长 ≈ 5 分钟

前言

  最近准备看一下计算机操作系统的书。现在习惯GoodNote上看PDF,并用MarkDown做笔记发布到博客上做知识管理。但大多数PDF都是扫描的图片,没法直接复制文本,以前都是累死累活的靠自己手打,今天突然想到为啥不自己写个脚本OCR一下呢…我人傻了。o(TヘTo)

正文

  其实要做一个OCR脚本很简单,调接口就完事了,好在百度云的API每天都有免费使用量,腾讯云只能免费体验一段时间。

注册账号

  开局一个号,API全靠嫖,你要是没有账号我也没法子了,动动手指而已,注册也没多麻烦。我想现在大多数人应该都是有百度账号的吧,毕竟还要用百度云盘。

获取API密匙

  登陆百度云,不是云盘那个云,是云计算的云。然后在产品目录搜索“文字识别”。


  然后在这个界面下方可以看到你免费版每天的使用次数,可以识别的种类特别多,我准备选用的是不带坐标信息的通用文字识别高精度版,每天可以白嫖500次,我一个人用的话完全足够了。要真是不够用,用完了大不了切换到普通版本将就着用,正常使用50000次每天不可能不够用,除非你写个for循环使劲糟蹋…

  后面那一栏的QPS限制是你的并发计算量,也就是说你的免费版本只能并发执行两个识别运算,一个人或少数人使用倒是问题不大。

  然后点击创建应用。



  应用配置这里把名字和备注填好就行了,其他没啥好改的,所有类型的文本识别接口都默认打开了。



  创建好以后进入应用详情页面。上方红框里的内容是待会儿会用到的API访问密钥,这个一定要保存好,不要被别人知道了,尤其是像python这种脚本代码在分享传播之前最好把密钥删掉。调用接口除了使用密钥以外还可以使用一些其他类似证书授权的方法,我这里就不在多做解释了。

  下方红框的URL决定了之后你要使用哪个版本的API。

  点击左上方的查看文档也有API各种语言的示例教程和更多使用方法,以后开发其他的项目时可以来这里学习。


配置代码

  首先拷贝下方的代码到自己的pythonista中,然后在分享扩展面板将其导入,之后这里将作为程序启动的入口。



  在使用之前首先要配置一点信息,就是我们上面注册账号获得的API密钥,并在下面填上你要选择使用的相应版本的接口链接,我默认已经为你填上了通用文本高精度版本了。

1
2
3
4
5
6
# API_key 为官网获取的AK, Secret_Key 为官网获取的SK
API_key="[换成自己的key]"
Secret_Key="[换成自己的key]"

#你所选用的API识别接口
API_URL="https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"

使用方法

  你需要选择一张图片,并将它分享到分享面板或者复制到粘贴板再打开分享面板都可以,代码会先查找是否有分享的图片,没有的话再检查粘贴板里有没有图片。比如说我这里是GoodNote中框选的一张截图。


  然后选择运行Pythonista代码,并启动之前导入的代码。



  整个窗口有两个页面,一个是你选择识别的图片,还有一个是识别的结果。



  程序会自动将识别结果复制到你的粘贴板,顶行将会显示一些提示信息。API传回的识别结果是一行一句的,所以有多个段落的话我也不知道哪些是一段的,所以干脆就全部拼接起来,由用户自己分段。我个人用的习惯是一次识别一段话,顶多也就两三段,打两个回车就好了。



  这是没有拼接的样子,虽然在有多段和小标题的情况下可以明显的将其区分出来,但是后面大整段都被分成一行一行的并不方便使用。



代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# -*- coding:utf-8 -*-
"""
@author:SiriYang
@file: ImageToText.py
@time: 2020.2.6 12:27
"""

import requests
import base64
import io
from PIL import Image

import ui
import console
import appex
import clipboard

'''
通用文字识别(高精度版)
'''
# API_key 为官网获取的AK, Secret_Key 为官网获取的SK
API_key="[换成自己的key]"
Secret_Key="[换成自己的key]"

#你所选用的API识别接口
API_URL="https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"

def imgToText(image):

global API_key
global Secret_Key
global API_URL

text_result=""
words_result_num=0

try:
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={AK}&client_secret={SK}'.format(AK=API_key,SK=Secret_Key)
access_token = ""
response = requests.get(host)
if response:
access_token = response.json()['access_token']

# 二进制方式打开图片文件
b = io.BytesIO()
image.save(b, 'JPEG')
img_data = base64.b64encode(b.getvalue())
b.close()

params = {"image":img_data}
request_url = API_URL + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)

if response:
json_data=response.json()
words_result_num=int(json_data['words_result_num'])
for i in json_data['words_result']:
text_result+=i['words']
except Exception:
text_result="识别失败!"
words_result_num=-1

return text_result,words_result_num

def pil2ui(imgIn):
b = io.BytesIO()
imgIn.save(b, 'JPEG')
imgOut = ui.Image.from_data(b.getvalue())
b.close()
return imgOut

class MainWindow(ui.View):

def __init__(self,img):
self.img=img
self.txt="正在识别,请稍等..."
self.rows=0

self.name="图片文字识别"
self.frame=(0,0,600,500)
self.background_color='white'

self.imgView=ui.ImageView()
self.textView=ui.TextView()
self.switchBtn=ui.SegmentedControl()

self.add_subview(self.imgView)
self.add_subview(self.textView)
self.add_subview(self.switchBtn)

self.loadUI()

self.present('sheet')

self.recognize()

def loadUI(self):
self.imgView.content_mode=ui.CONTENT_SCALE_ASPECT_FIT
self.imgView.image=pil2ui(self.img)

self.textView.text=self.txt
self.textView.font=("<system>",16)

self.switchBtn.segments=['图片','文本']
self.switchBtn.action=self.switch_Act
self.switchBtn.selected_index=0
self.imgView.hidden=False
self.textView.hidden=True

def layout(self):
self.imgView.frame=(0,0,self.width,self.height-50)

self.textView.frame=(0,0,self.width,self.height-50)

self.switchBtn.frame=(0,self.height-50,self.width,50)

def recognize(self):

self.txt,self.rows=imgToText(self.img)
if self.rows>=0:
info="识别成功,识别结果共{row}行,{len}字,已拷贝到粘贴板!\n\n".format(row=self.rows,len=len(self.txt.replace(" ","").replace("\n","")))
self.textView.text=info+self.txt

clipboard.set(self.txt)
else:
self.textView.text=self.txt
console.alert("错误",self.txt,"确定",hide_cancel_button=True)

def switch_Act(self,sender):
if(self.switchBtn.selected_index==0):
self.imgView.hidden=False
self.textView.hidden=True
else:
self.imgView.hidden=True
self.textView.hidden=False

def main():
if not appex.is_running_extension():
print('这个脚本必须在分享扩展面板使用!')
return

orgImg = appex.get_image()
if not orgImg:
orgImg = clipboard.get_image()

if not orgImg:
console.alert("错误","没有找到图片!","确定",hide_cancel_button=True)
return

v=MainWindow(orgImg)

if __name__ == "__main__":
main()
-------- 本文结束 感谢阅读 --------
相关文章
  • Transista for iPadOS
  • 基于Pythonista和百度API的图片文本识别翻译脚本
  • AppWishList for iOS
  • 自己动手写一个相机参数水印生成器
  • Pythonista中文文档:scene
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: 基于Pythonista和百度API的高精度文本识别脚本
  • 本文作者: SiriYang
  • 创建时间: 2020年02月06日 - 17时02分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20200206175606id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
iOS Python Pythonista 项目
X-Data数据工程基础实践(八)
X-Data数据工程基础实践(七)
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 前言
  2. 正文
    1. 注册账号
    2. 获取API密匙
    3. 配置代码
    4. 使用方法
    5. 代码
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%