本文主要是介绍Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Python3.7+PyQt5.0+百度文字识别OCR接口实现图片批量转文字并输出为Windows可执行文件
搭建环境:
1.Python3.7
2.Pycharm编译环境
3.PyQt库
4.百度OCR文字识别调用接口账号(APP_ID,APP_Key,Secret Key)
本项目用到的Python库:Pillow,baidu-aip,pyinstaller,urllib3,PyQt5等,可通过Pycharm在线安装或通过Pip install 安装
成功检测搭建环境完成方法:
1.Cmd-Python 可成功显示Python版本号信息进入Python运行环境
2.Pycharm网上直接下载安装,首次安装有30天试用期
3.PyQt5库可采用pip install --在线方式安装,或者采用pip线下安装,不建议在线安装,不一定和Python3.7可配套使用。
PyQt5下载地址:https://pypi.python.org/pypi/PyQt5
4.百度OCR文字识别接口个人账号申请(产品服务-人工智能-文字识别)
账号申请网址:https://cloud.baidu.com/
Pycharm环境配置
1.获取并导入当前本地Python库
File-Setting-“当前项目名称”-Python Interpreter-设置-Add-Location-Inherit global site-packages。
2.使用External tools建立扩展工具 QTUI 和 To Py
QTUI 和 To Py的作用如下:
a.QTUI :调用PyQt5库安装后生成的Desinger.exe程序开启程序可视化界面设计。
b.To Py:QTUI生成的界面是.ui格式,Python运行需要将.ui格式的界面文件转换为.py文件,To Py可实现该功能。
c.QT UI扩展工具的设置
d.To Py 工具的设置
Program:选择Python安装路径下Script文件夹下的Python.exe文件
Arguments:-m PyQt5.uic.pyuic F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension.py
Working dorectory: F i l e D i r FileDir FileDir
e.扩展工具的使用
Pycharm菜单栏-Tools-External tools-QT UI(启动设计界面)
.ui文件右键-External tools-To Py(转换Python文件)
示例代码
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import glob
from os import path
import os
from aip import AipOcr
from PIL import Imageclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(775, 234)MainWindow.setSizeIncrement(QtCore.QSize(20, 20))MainWindow.setBaseSize(QtCore.QSize(18, 20))self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(60, 10, 101, 41))self.label.setMinimumSize(QtCore.QSize(20, 20))self.label.setSizeIncrement(QtCore.QSize(2, 2))self.label.setBaseSize(QtCore.QSize(20, 18))font = QtGui.QFont()font.setPointSize(18)self.label.setFont(font)self.label.setTextFormat(QtCore.Qt.AutoText)self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(60, 50, 101, 41))font = QtGui.QFont()font.setPointSize(18)self.label_2.setFont(font)self.label_2.setObjectName("label_2")self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setGeometry(QtCore.QRect(10, 90, 151, 41))font = QtGui.QFont()font.setPointSize(18)self.label_3.setFont(font)self.label_3.setObjectName("label_3")self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit.setGeometry(QtCore.QRect(160, 20, 601, 31))font = QtGui.QFont()font.setPointSize(18)self.lineEdit.setFont(font)self.lineEdit.setObjectName("lineEdit")self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_2.setGeometry(QtCore.QRect(160, 60, 601, 31))font = QtGui.QFont()font.setPointSize(18)self.lineEdit_2.setFont(font)self.lineEdit_2.setText("")self.lineEdit_2.setObjectName("lineEdit_2")self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_3.setGeometry(QtCore.QRect(160, 100, 601, 31))font = QtGui.QFont()font.setPointSize(18)self.lineEdit_3.setFont(font)self.lineEdit_3.setText("")self.lineEdit_3.setObjectName("lineEdit_3")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(410, 150, 171, 51))font = QtGui.QFont()font.setPointSize(18)self.pushButton.setFont(font)self.pushButton.setObjectName("pushButton")self.pushButton.setToolTip("确认")self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(590, 150, 171, 51))font = QtGui.QFont()font.setPointSize(18)self.pushButton_2.setFont(font)self.pushButton_2.setObjectName("pushButton_2")MainWindow.setCentralWidget(self.centralwidget)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)# 单击Confirm事件进行转换self.pushButton.clicked.connect(Buttonclick)# 单击Cancle按键退出程序self.pushButton_2.clicked.connect(quit)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "Pic-Txt"))self.label.setText(_translate("MainWindow", "APP ID :"))self.label_2.setText(_translate("MainWindow", "API Key:"))self.label_3.setText(_translate("MainWindow", "SECRECT_KEY:"))self.lineEdit.setText(_translate("MainWindow", ""))self.lineEdit_2.setText(_translate("MainWindow", ""))self.lineEdit_3.setText(_translate("MainWindow", ""))self.pushButton.setText(_translate("MainWindow", "confirm"))self.pushButton_2.setText(_translate("MainWindow", "cancle"))def quit():sys.exit(app.exec_())def Buttonclick():appid =ui.lineEdit.text()appkey =ui.lineEdit_2.text()appword = ui.lineEdit_3.text()outfile = 'export.txt'outdir = 'tmp'if path.exists(outfile):os.remove(outfile)if not path.exists(outdir):os.mkdir(outdir)print("压缩过大的图片...")for picfile in glob.glob("picture/*"):convertimg(picfile, outdir)print("图片识别...")for picfile in glob.glob("tmp/*"):baiduOCR(picfile, outfile, appid, appkey, appword)os.remove(picfile)print('图片文本提取结束!文本输出结果位于 %s 文件中。' % outfile)os.removedirs(outdir)def convertimg(picfile, outdir):'''调整图片大小,对于过大的图片进行压缩picfile: 图片路径outdir: 图片输出路径'''img = Image.open(picfile)width, height = img.sizewhile (width * height > 4000000): # 该数值压缩后的图片大约 两百多kwidth = width // 2height = height // 2new_img = img.resize((width, height), Image.BILINEAR)new_img.save(path.join(outdir, os.path.basename(picfile)))def baiduOCR(picfile, outfile,appid,appkey,appword):"""利用百度api识别文本,并保存提取的文字picfile: 图片文件名outfile: 输出文件"""filename = path.basename(picfile)APP_ID = appidAPI_KEY = appkeySECRECT_KEY = appwordclient = AipOcr(APP_ID, API_KEY, SECRECT_KEY)i = open(picfile, 'rb')img = i.read()print("正在识别图片:\t" + filename)message = client.basicGeneral(img) # 通用文字识别,每天 50 000 次免费# message = client.basicAccurate(img) # 通用文字高精度识别,每天 800 次免费print("识别成功!")i.close();with open(outfile, 'a+') as fo:fo.writelines("+" * 60 + '\n')fo.writelines("识别图片:\t" + filename + "\n" * 2)fo.writelines("文本内容:\n")# 输出文本内容for text in message.get('words_result'):fo.writelines(text.get('words') + '\n')fo.writelines('\n' * 2)#print("文本导出成功!")print()
#主程序
if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())
主界面设计
7.将Python项目输出为Windows EXE可执行文件
1)打开Pycharm。
2)打开Terminal(快捷键Alt + F12)
3)Pip安装pyinstaller工具
pip install pyinstaller
4)生成本项目可执行文件--------Terminal中输入:
pyinstaller -F -w UI.py
注:UI.py是我的项目启动文件名称,你要替换成你自己的项目启动名称。
生成的可执行文件放在同目录dist下。
-F(注意大写)是所有库文件打包成一个可执行文件,windows下是exe,Linux下是对应的可执行文件;
-w是禁止弹出黑色控制台窗口。
如果你的项目调用了图片等本地资源,请将你的可执行文件放在对应目录才能运行。
程序输出
程序输出后生成UI.exe Windows可执行程序,同时在同目录下新建Picture文件夹,然后将待转换图片放到Picture文件夹内,点击Confirm。同目录输出的Export.txt为图片转换后的结果,支持批量转换。
这篇关于Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!