搭建环境:
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/
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 Image
class 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.translate
MainWindow.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.size
while (width * height > 4000000): # 该数值压缩后的图片大约 两百多k
width = width // 2
height = height // 2
new_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 = appid
API_KEY = appkey
SECRECT_KEY = appword
client = 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为图片转换后的结果,支持批量转换。