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 安装
Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第1张图片
成功检测搭建环境完成方法:
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程序开启程序可视化界面设计。Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第2张图片
b.To Py:QTUI生成的界面是.ui格式,Python运行需要将.ui格式的界面文件转换为.py文件,To Py可实现该功能。
Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第3张图片
c.QT UI扩展工具的设置
Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第4张图片
d.To Py 工具的设置
Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第5张图片
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_())

主界面设计

Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第6张图片
7.将Python项目输出为Windows EXE可执行文件
1)打开Pycharm。
2)打开Terminal(快捷键Alt + F12)
Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第7张图片
3)Pip安装pyinstaller工具

pip install pyinstaller

4)生成本项目可执行文件--------Terminal中输入:

pyinstaller -F -w UI.py

Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第8张图片

注:UI.py是我的项目启动文件名称,你要替换成你自己的项目启动名称。
生成的可执行文件放在同目录dist下。
  -F(注意大写)是所有库文件打包成一个可执行文件,windows下是exe,Linux下是对应的可执行文件;
  -w是禁止弹出黑色控制台窗口。
  如果你的项目调用了图片等本地资源,请将你的可执行文件放在对应目录才能运行。

程序输出

程序输出后生成UI.exe Windows可执行程序,同时在同目录下新建Picture文件夹,然后将待转换图片放到Picture文件夹内,点击Confirm。同目录输出的Export.txt为图片转换后的结果,支持批量转换。
Python3.7+PyQt5.0+百度文字识别OCR实现图片批量转文字_第9张图片

你可能感兴趣的:(技术文档,python,图像识别,自然语言处理)