实现一个文字识别(图片转文字)工具

00 前言

       最近做ppt,看到有些图片中的文字内容很好,一张一张地码字很累还很费时间。就想着有空做一个文字识别的小工具,方便办公流程。在网上查了一下资料,百度智能云提供了文字识别的接口,可以直接调用,挺方便的。于是就做了一个小工具,和大家分享一下制作过程。

01 准备

01 -1 虚拟环境

本文所用版本是python3.8.2,新版的python都自带一个创建虚拟环境模块。新建一个工作目录名叫Image2Text。

mkdir Image2Text     //也可以直接用鼠标右键创建文件夹
cd Image2Text        //进入项目文件夹
python -m venv venv     //创建虚拟环境,第一个venv是包名,第二个是创建虚环境名字(可以用项目名)

 然后在venv文件夹下我们看到如下的目录,虚拟环境激活后才能使用,激活的脚本在Scripts里面。

 于是,我们进到Scripts文件夹里面,执行激活脚本。使用activate激活(使用deactivate.bat 退出)。

01 -2 安装依赖

其中PySide2是做界面的。baidu-aip 是调用的百度的文字识别接口,是主要功能。

 pip3 install PySide2pip install baidu-aip

 

注:之前使用pyQt5出现了qt.qpa.plugin: Could not find the Qt platform plugin "windows"这个问题,然后用pip3 install PySide2下载PySide2,并修改了路径。

01 -3 图片识别SDK

根据百度的文本识别SDK介绍(https://ai.baidu.com/ai-doc/OCR/Dk3h7yf8m),我们需要注册百度智能云的账户,并在安全中心获取API_KEY(对应百度智能云的“Access Key ID”)和SECRET_KEY(对应百度智能云的“Access Key Secret”)。

02 开始

02-1 调用接口测试

百度文本识别的接口很丰富,有通用文本识别、包含位置信息的文本识别、驾照识别等等。我这里面用的是通用的文本识别,首先,新建一个orc_util.py文件引用接口并说明认证信息。

from aip import AipOcr
# 添加认证信息,这里面的api密钥和secret密钥可以去百度智能云免费申请
APP_ID = ''
API_KEY = 'd7a50f1938xxxxxxxxxx5277a51e23'
SECRET_KEY = 'e6ca46bdxxxxxxxxxxxx053cf288b'

 然后,我们定义一个获取图片的方法。

def get_ocr_str(file_path, origin_format=True):"""获取图片比特流:param file_path: 图片路径:return: 函数get_ocr_str_from_bytes()的结果"""with open(file_path, 'rb') as fp:file_bytes = fp.read()return get_ocr_str_from_bytes(file_bytes, origin_format)

 然后定义一个转换方法,设置options参数(不检测文本方向,语言模式为中英文),实例化一个AipOcr类,调用basicGeneral()接口。通用文字识别的请求参数见表1,通用文字识别的返回参数见表2。

def get_ocr_str_from_bytes(file_bytes, origin_format=True):"""图片转文字:param file_bytes: 图片的字节:return: result_str"""options = {'detect_direction': 'false','language_type': 'CHN_ENG',}ocr = AipOcr(APP_ID, API_KEY, SECRET_KEY)result_dict = ocr.basicGeneral(file_bytes, options)if origin_format:result_str = '\n'.join([entity['words'] for entity in result_dict['words_result']])else:result_str = ''.join([entity['words'] for entity in result_dict['words_result']])return result_str
表1  通用文字识别,请求参数
参数名称是否必选类型可选值范围默认值说明
imagestring  图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
urlstring  图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
language_typestringCHN_ENG
ENG
POR
FRE
GER
ITA
SPA
RUS
JAP
KOR
CHN_ENG识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
detect_directionstringtrue
false
false是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
detect_languagestringtrue
false
false是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
probabilitystringtrue
false
 是否返回识别结果中每一行的置信度
表2 通用文字识别,返回参数
字段必选类型说明
directionnumber图像方向,当detect_direction=true时存在。
- -1:未定义,
- 0:正向,
- 1: 逆时针90度,
- 2:逆时针180度,
- 3:逆时针270度
log_idnumber唯一的log id,用于问题定位
words_result_numnumber识别结果数,表示words_result的元素个数
words_resultarray定位和识别结果数组
+wordsstring识别结果字符串
probabilityobject行置信度信息;如果输入参数 probability = true 则输出
+averagenumber行置信度平均值
+variancenumber行置信度方差
+minnumber行置信度最小值

然后,定义主函数开始测试吧。

if __name__ == '__main__':IMAGE_PATH = "test.jpg"print(get_ocr_str(IMAGE_PATH))

我们的测试图是这样的,测试的时候直接截的cmd命令行的报错信息,命名为test然后保存在当前的目录下。

cmd命令行运行结果如下 ,我们可以看到识别结果还是不错的,并且还保留了原格式。emm, 那么开始做界面吧。

 

02-2 界面编写

       ok,我们要开始编写界面了, 我这边使用的是PySide2,打算后期再美化一下。也可以使用python自带的tkinter。好了,我们新建一个MainUi.py文件。同样,引入需要的包,设置一个全局的资源变量(等待转换时的图标)。

        中间遇到过一个问题,最开始运行MainUi.py文件的时候,提示找不到Qt插件,也就是qt.qpa.plugin: Could not find the Qt platform plugin "windows"这个问题,然后找到了如下的解决方式。

import sys
import PySide2
import os
'''
#添加PySide2路径,为了解决qt.qpa.plugin: Could not find the Qt platform plugin "windows"这个问题;
#也可以修改文件"C:\Applications\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\Lib\site-packages\PySide2_init_.py" ,作者用的是WinPython ,dirname = os.path.dirname(__file__)plugin_path = os.path.join(dirname, 'plugins', 'platforms')os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
'''
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
import ocr_util
import threading
from PySide2 import QtWidgets
from PySide2.QtCore import Signal,Slot
from PySide2.QtGui import QMovie,QPixmap,QIcon#设置资源变量
LOADING_GIF_URL = './asset/file.png'

然后定义一个类,设置一个信号量,用于连接返回的识别结果,并显示到文本框中。 

class MainUi(QtWidgets.QMainWindow):signal_response = Signal(str)def __init__(self):super().__init__()self.init_ui()

 定义一个初始化方法,添加两个布局,一个用来放文本框,一个用来放按钮,截取图片功能没有实现哦,打算后面做的。

def init_ui(self):#初始化一个窗口,主界面采用固定大小,网格布局self.setMinimumSize(800,500)self.main_widget = QtWidgets.QWidget()  # 创建窗口主部件self.main_layout = QtWidgets.QGridLayout()  # 创建主部件的网格布局self.main_widget.setLayout(self.main_layout)  # 设置窗口主部件布局为网格布局#添加上下两个widget,布局用self.up_widget = QtWidgets.QWidget()  # 创建部件self.up_widget.setObjectName('up_widget')self.up_layout = QtWidgets.QGridLayout()  # 创建部件的网格布局层self.up_widget.setLayout(self.up_layout) # 设置部件布局为网格self.down_widget = QtWidgets.QWidget() self.down_widget.setObjectName('down_widget')self.down_layout = QtWidgets.QGridLayout()self.down_widget.setLayout(self.down_layout) #添加上下两个widget到主部件中self.main_layout.addWidget(self.up_widget,0,0,6,8) # 上侧部件在第0行第0列,占4行8列self.main_layout.addWidget(self.down_widget,6,0,2,8) # 下侧部件在第6行第0列,占2行8列self.setCentralWidget(self.main_widget) # 设置窗口主部件#添加图片按钮和截取图片按钮self.add_pic = QtWidgets.QPushButton("添加图片")self.add_pic.setObjectName('add_pic')self.add_pic.clicked.connect(self.on_add_pic_clicked)#连接点击事件self.cap_pic = QtWidgets.QPushButton("截取图片")self.cap_pic.setObjectName('cap_pic')#添加按钮到下widget中self.down_layout.addWidget(self.add_pic,6,1,1,1)self.down_layout.addWidget(self.cap_pic,6,5,1,1)#添加文本框用来显示识别的文字self.textEdit = QtWidgets.QTextEdit('说明:图片格式要求不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式')self.textEdit.setReadOnly(True)#文本框设为不可编辑self.up_layout.addWidget(self.textEdit,0,0,6,8)self.init_loading_gif()self.signal_response.connect(self.__slot_http_response)#连接信号和槽函数,将结果显示在文本框中

     由于文字识别的时候还是有2秒左右的检测时间的,所以添加了一个等待的图片,发现用.png格式的图片就可以显示,用.gif格式的文件就不能显示,很奇怪。

 def init_loading_gif(self):"""初始化loading动画:return:"""gif = QMovie(LOADING_GIF_URL)gif.start()x, y = 275, 110self.loadingLabel = QtWidgets.QLabel(self)self.loadingLabel.setMovie(gif)self.loadingLabel.adjustSize()self.loadingLabel.setGeometry(x, y, self.loadingLabel.width(), self.loadingLabel.height())self.loadingLabel.setVisible(False)

 点击按钮事件,打开文件对话框,获取文件路径,然后清空文本框内容,准备显示识别结果,并调用run_ocr_async()方法。

    @Slot()def on_add_pic_clicked(self):#点击添加图片dialog = QtWidgets.QFileDialog()#生成文件对话框对象dialog.setFileMode(QtWidgets.QFileDialog.AnyFile)#设置文件过滤器,这里是任意文件,设置参考https://www.jianshu.com/p/4b297a825a04file_urls = dialog.getOpenFileNames()[0]#获取文件名称if len(file_urls) > 0:self.textEdit.clear()for img_full_path in file_urls:if img_full_path is None or img_full_path == '':continuewith open(img_full_path, 'rb') as fp:file_bytes = fp.read()self.run_ocr_async(file_bytes)

等待的时候让等待的图片显示出来,然后调用我们之前编写的图片识别函数返回信号量,并将信号量传递给槽函数,显示在文本框中。

    def run_ocr_async(self, image_bytes):self.loadingLabel.setVisible(True)threading.Thread(target=self.job_ocr, args=(image_bytes,)).start()def job_ocr(self, image_bytes):result = ''try:result = ocr_util.get_ocr_str_from_bytes(image_bytes)finally:self.signal_response.emit(result)@Slot(str)def __slot_http_response(self, result):self.textEdit.append(result)self.textEdit.setReadOnly(False)#文本框设为可编辑self.loadingLabel.setVisible(False)

 MainUi类定义好了,开始编写main函数,并使用。

def main():app = QtWidgets.QApplication(sys.argv)gui = MainUi()gui.show()sys.exit(app.exec_())if __name__ == '__main__':main()

02-3 完成

运行一下,看看成果吧。

 打开文件。

ok,识别文字显示的也不错。后期界面功能再完善一下就好了。 

 

03 未解决的问题

添加等待动画的时候,发现用.png格式的图片就可以显示,用.gif格式的文件就不能显示,很奇怪。有了解的兄弟还望赐教。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android上图片文字识别

前言 OCR 是 Optical Character Recognition 的缩写,翻译为光学字符识别,指的是针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,通过识别软件将图像中的文字转换成文本格式,供文字处理软…

图片转文字,实用的图片文字识别工具

我们在平时的工作和学习生活中,一旦碰到一些需要拷贝下来的图片上的文字,通常我们的做法就是手动抄录文字,或者对照图片在电脑上敲打这些文字。 其实,现在已经有很多图片文字识别软件,我们可以直接利用工具来帮助我们…

如何识别图片中的文字?三种方法轻松搞定

在我们日常办公中,常常需要将纸质文件的文字提取出来,转为电子档,如果字比较少的情况,还可以手打。但是如果字比较多的话,就有些累了,还可能耽误后面的工作,是不是有小伙伴和我一样有这种困扰呢…

tesseract-ocr识别英文和中文图片文字以及扫描图片实例讲解

tesseract-ocr识别英文和中文图片文字以及扫描图片实例讲解 本文参考http://blog.sina.com.cn/s/blog_4aa166780101cji7.html实现,在这里感谢该文章的作者。 OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取…

识别图片中文字的三种方法/图片转文字

一、钉钉 钉钉内置了很多小功能。打开手机钉钉,点击左下角的消息按钮,然后点击右上角的号-扫一扫,点击拍图识字选中需要识别的文字即可。 二、QQ 打开手机QQ,点击右上角的+号-扫一扫之后,点击转文字把图片…

【老保姆教程】:Tesseract-OCR图片文字识别

文章目录 🌟介绍一波🌟小安装🌟配置环境变量⭐️tesseract-ocr配置⭐️tessdata语言配置⭐️检测环境变量是否安装成功 🌟语言包的配置使用🌟CMD命令框中进行图片识别操作⭐️举例一:识别数字⭐️举例二&am…

tesseract:从图片中识别文字信息

一、安装 tesseract 安装过程:https://blog.csdn.net/fengbohello/article/details/119272478 二、安装训练后的语言文件 下载英文数据:https://github.com/tesseract-ocr/tessdata/blob/master/eng.traineddata 下载简体中文数据:https:…

ChatGPT在智能外呼机器人领域的应用

随着人工智能技术的不断发展,自然语言处理(NLP)技术也逐渐成为各行各业的热门技术。其中,ChatGPT技术是近年来备受关注的技术之一。ChatGPT技术是一种基于自然语言处理和深度学习的人工智能技术,它可以处理自然语言文本,实现自动化…

Linux mailutils 如何使用 mail 指令在命令行发送邮件

Linux mailutils 如何使用 mail 指令在命令行发送邮件 一、mail 指令的说明 查看 mail 的帮助信息 mail --help能看到一些可用的参数 -A 添加文件作为邮件附件s 设置邮件标题 二、一般用法 1. 填写目标邮箱 mail kylebing163.com点击回车之后,它会让你输入抄…

linux中使用mail命令发送邮件详解

linux中使用mail命令发送邮件详解 1、最简单的三种发邮件方式 第一种 #可以把当前的shell当成编辑器来使用,编辑完成后使用ctrld来结束编辑并发送 mail -s test 12121qq.com第二种 #使用|进行编辑发送 echo "test"|mail -s test 12121qq.com第三种 #…

通讯白名单的设置与使

通讯白名单是指只有白名单中的人员可以给该用户发送电子邮件和微讯,如果没有设置通讯白名单,系统中所有的人员都可以给其发送电子邮件和微讯。 通讯白名单的设置 在系统管理--组织机构设置--用户管理中点击要设置人员对应的“更新”按钮,更…

哪个更安全?白名单还是黑名单?Agent端对监控指标黑白名单的支持

“实际上,agent端指标的白名单和黑名单也是Zabbix培训中的一个重要主题。”   ——Kaspars Mednis , 全球培训师负责人,Zabbix SIA   本文整理自Kaspars 在2020Zabbix中国峰会的演讲,ppt获取链接见文末。更多演讲视频可关注官方Bilibili账…

nginx配置IP白名单

分析nginx访问日志,有哪些IP访问过nginx。 命令参考:awk {print $1} logs/access.log | sort | uniq -c | sort -nr -k1 输出的效果案例: 1053 192.168.3.15 893 192.168.3.10 818 192.168.0.8 1、添加IP白名单文件 在nginx目录的 conf …

Linux如何给服务器增加白名单

1、查看系统白名单配置: iptables -L -n 2、增加白名单(19.40.145.140 是需要增加的服务器IP): iptables -I INPUT -s 19.40.145.140/32 -p tcp -j ACCEPT 注:-I(I是i的大写) 3、查看防火墙状…

任正非:小公司,不要有太多方法论,把豆腐磨好就有人买

推荐阅读:16 款 ChatGPT 工具,太炸裂了! 不同性格、不同特长、不同偏好的人能否凝聚在组织目标和愿景的旗帜下,靠的就是管理者的宽容。 来源 | 新商业思想库 作者 | 任正非 “烧不死的鸟是凤凰,从泥坑里爬出来的才是圣…

电商商城小程序项目完整源码(微信小程序)

微信公众号:创享日记 发送:简商城 获取完整源码(导入微信开发者工具即可) 【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。…

死磕数据库系列(二十):MySQL 数据库 DDL、DML、DQL、DCL 语言理论与实践(sql 8.0 版)...

点关注公众号,回复“1024”获取2TB学习资源! 今天,民工哥带大家一起来学习一下 MySQL 数据库的 DDL、DML、DQL、DCL 这几种语言的理论知识与实践。如有帮助,请点在看、转发支持一波!!! DDL&…

安卓app汉化教程

有时候有些软件都是English的,尽管对英语略懂,但是都是看着别扭(我基本都看不懂。)如果每次都点翻译的话又是一个很繁琐的事情。所以我们来一次app汉化的教程 首先我们需要一个文件管理器,但是手机自带的基本没有修改权…

常用24位颜色表转换成16位颜色值,让16位lcd使用

如果需要直接屏幕任意颜色转换成16位颜色值请下载转换程序,不用注册,就可使用 https://download.csdn.net/download/rachenjian/12968346 16位颜色表 #define N_Coloe_B16LightPink 0xFDB8 //24位0xFFB6C1 浅粉红 #define N_Coloe_B16Pink …

Qt 5.12--color

Qt 5.12--color 1 简介2 颜色代码2.1 16进制2.2 RGB数值 3 常用4 查找网站5 css color6 其他参考 1 简介 颜色是UI的基础,具体表示可以是十六进制颜色码,英文名,RGB数值。 2 颜色代码 2.1 16进制 详见RGB颜色查询对照表 常用如下 2.2 R…