附注为对个人撰写小流程的真实世界经历,concerned,普伊隆。生前是两个光明节python的非流程员,python的书刊买了一堆(cookbook\简洁的python\利用python展开数据挖掘等等都有),但我都没看多少(全自动濶濑)。好景不长学习python之后,生前仍旧期望能运用于两栖作战,也写过一些小工程项目,但仍旧感觉理论性不如强。期间曾经用PyQt5为前老板娘写过两个查阅小流程(概要诸多不便透漏),事前老板娘问我若想弄成exe直接用,当时依照布季谢pyinstaller装箱的经验上看,技术难度非常高(实际上布季谢pyinstaller装箱复杂一点的工程项目没有成功过呵呵),所以我主动出击宣称了能力非常有限,不能装箱。。。 但对于不能程式设计的人来说,采用小流程要给他装箱成exe,因而有一两年我很苦恼,直到在chan上看见了某天神发的采用Nuitka装箱的系列产品该文,总算让我看见了期望。于是我仍旧想做的两个工程项目在心中总算能形成两个生态圈:用PyQt5做介面,用成像辨识API展开文本辨识,皮德盖Nuitka装箱成exe。呵呵,看上去还是极具方法论的。好了,话不多说,上面进入蔬果介绍多马尔坦:

成像辨识

在python江苏舜天队展开成像辨识的组件有不少,比如pytesseract,但是依照我的采用体会上看,辨识效用比较通常,而且其实用性也不太亲善,因而我这里采用的是腾讯的成像辨识组件,也是腾讯智能化云的pythonUSB,采用那个组件需要注册登记腾讯帐号,然后建立工程项目,你会得到AppID、APIKey、SecretKey,这三个模块是初始化api时候要的(相等于你的帐号信息),另外那个组件的完全免费初始化单次是有下限的,但是通常的对个人采用足够多。上面得出初始化api的示例:

fromaipimportAipOcr“”” 你的 APPID AK SK “””APP_ID=xxxxxxAPI_KEY=xxxxxxxxxxxSECRET_KEY=xxxxxxxxxxclient=AipOcr(APP_ID,API_KEY,SECRET_KEY)“”” 加载相片 “””defget_file_content(filePath):withopen(filePath,rb)asfp:returnfp.read()image=get_file_content(image.jpg)options = {}options[“detect_direction”] = “true”options[“probability”] = “true”“”” 初始化通用文本辨识, 相片模块为本地相片,打印出来的结果可以自行分析采用 “””print(client.basicGeneral(image))

后那个API是有多种辨识模式的,像通用辨识/通用精确辨识/身份证辨识等,甚至能辨识表格,具体的初始化方式这里不再介绍,官网都有很详细的教程。其实成像辨识部分不同的组件各有各的短处,好用才是王道,像本文采用的那个组件不能断网辨识,可以说萝卜青菜,各有所爱了,哪种合适自己的工程项目用哪一种,这里本文只是得出生前的一点采用经验。

PyQt5介面设计

本文的小流程的介面是采用PyQt5展开设计的,其实python自带的Tkinter也不错,但是感觉还是没有前者专业(对个人感觉),说到PyQt5的采用我不得不强行安利一本书了《Python Qt GUI与数据可视化程式设计》,基本我所有python Qt方面的知识都是来自于这本书,但是这本书没有python基础的同志读起来可能有些费劲,基本是采用面向对象的方式写的,但是能学习GUI的同志基础应该都不能差吧呵呵。这里我说一下我的小流程的主要实现过程(详细过程同志们可以参考上述书刊,内容很多),首先是主要介面的设计,那个是借助可视化工具Qt Creator展开设计的,如下图所示,你可以利用各种工具可视化地设计主要介面:

PyQt5+腾讯成像辨识软件包+Nuitka装箱=文本辨识小流程.dll插图

需要说明的是,可视化设计也是有一系列产品技巧以及注意事项的,同志们学习的时候还是要循序渐进,不要着急,我也是踩过了很多的坑才逐渐完成了那个比较通常的介面(天神请无视我这句话)

完成介面的主题设计之后,需要将Qt Creator中生成的.ui文件编译为对应的python文件,通常采用批处理文件(.bat)来展开那个操作,如下图所示,是先复制.ui文件,然后用pyuic5展开编译,这样能得到对应的python文件了:

echo off rem 将子文件夹QtApp下的.ui文件复制到当前目录下 copy .\OCR\mainwindow.ui mainwindow.ui rem 用pyuic5编译.ui文件 pyuic5 -o mainwindow.py mainwindow.ui pyuic5 -o screenshot.py widget.ui rem 编译并复制资源文件 pyrcc5 .\OCR\res.qrc -o res_rc.py

得到对应的python文件之后,我们可以以那个文件为基础,加入我们的介面交互方法论,从而实现介面设计和流程交互方法论的分离,上面得出流程的方法论交互的部分截图,具体的函数实现涉及PyQt5的细节操作了,这里不详细得出。

import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QActionGroup, QLabel, QProgressBar, QSpinBox, QFontComboBox, QFileDialog, QColorDialog) 导入可视化介面设计生成的.py文件 from mainwindow import Ui_MainWindow from PyQt5.QtGui import QBrush, QIcon, QFont, QPixmap from PyQt5.QtCore import Qt, pyqtSlot, QRect, QDir 这是截图文件,后续会介绍 from screen_shot_class import QScreenshot from PIL import ImageQt 这是腾讯的文本辨识库 from aip import AipOcr class Qmywindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) 示例化可视化介面中设计的窗口类(ui_mainwindow.py) self.ui = Ui_MainWindow() 初始化设置函数建立介面元素 self.ui.setupUi(self) 初始化数据准备进度 self.__buildUI() 动态建立组件,添加到工具栏和状态栏 self.__spinFontSize.valueChanged[int].connect( self.do_fontSize_Changed) 字体大小设置 self.__comboFontName.currentIndexChanged[str].connect( self.do_fontName_Changed) 字体选择 将截图按钮和截图函数连接起来 self.ui.radioButton.clicked.connect(self.screenshot) self.curPixmap = QPixmap() self.pixRatio = 1 初始化介面显示的相片 self.photo_label_prepare() self.setWindowState(Qt.WindowMaximized) “”” 你的 APPID AK SK “”” self.APP_ID = xxxxx self.API_KEY = xxxxxxxxx self.SECRET_KEY = xxxxxxxx if __name__ == “__main__”: app = QApplication(sys.argv) form = Qmywindow() form.show() sys.exit(app.exec_())

关于如何用PyQt5截图,着实费了我一番功夫,终我解决的思路是,首先小化主介面,然后弹出两个全屏的对话框,设置对话框的透明度为0.1(几乎透明),然后用画图工具记录鼠标按下和释放的坐标,得到坐标之后利用PIL库获取截图。

至此,整个流程在python层面完成了,对于电脑中安装了python的人来说,这已经结束了,但是对于想直接用的用户,我们还需要将流程展开装箱,受到chan大佬用Nuitka装箱相关该文的启发,我这次采用的也是Nuitka,但愚蠢的我竟然花了一两天才勉强装箱完成,现在我把我的装箱过程跟各位分享一哈:

工程项目后一步Nuitka装箱

按照chan大佬该文的指点,我安装了Nuitka,并添加了环境变量,这样总算可以愉快的采用Nuitka了,但是我次的装箱尝试失败了,双击exe直接给我闪退了,这里需要提醒一下,我们双击直接闪退这样是不知道问题出在哪里的,你需要在终端中运行exe,这样在终端中会显示报错信息。我的次报错信息是No module named PIL,想了好久,后还是在Nuitka的帮助上找到了蛛丝马迹:

Control the inclusion of modules and packages: –include-package=PACKAGE Include a whole package. Give as a Python namespace, e.g. “some_package.sub_package“ and Nuitka will then find it and include it and all the modules found below that disk location in the binary or extension module it creates, and make it available for import by the code. Default empty. –include-module=MODULE Include a single module. Give as a Python namespace, e.g. “some_package.some_module“ and Nuitka will then find it and include it in the binary or extension module it creates, and make it available for import by the code. Default empty.

我寻思加上 –include-package=PIL这总可以了吧,结果又出现了No module named aip,那我再加–include-package=PIL, aip,结果又报错No module named requests,但我的流程并没有采用requests啊,那个问题在以前采用pyinstaller时我遇到过,应该是由于aip又采用了requests,那我再加,如此循环每次尝试都得好几分钟,终我添加的语句是这样的:–include-package=requests,PIL,aip,urllib3,chardet,然后又出现No module named screen_shot_class,同理我再加–include-module=screen_shot_class,继续循环终又加上了–include-module=res_rc,screenshot 。那么终我的装箱代码是这样的:

D:\VS_CODE_python_project\python_GUI_code\ocr_project>pythonmnuitkastandalonewindowsdependencytool=pefileexperimental=use_pefile_recurseexperimental=use_pefile_fullrecursenofollowimportspluginenable=qtpluginsfollowimportto=needincludepackage=requests,PIL,aip,urllib3,chardetincludemodule=res_rc,screenshotmain_function.py

其中大部分模块是参考chan天神的介绍的。对了我的上述代码没有添加包括资源文件,需要自己手工将资源文件复制上去(因为我只有两个相片作为资源文件),我目前还不是很清楚这种资源文件如何准确添加上去的,只能等待后续研究啦!

总结

那么终通过上述步骤,我的成像文本辨识小流程做好了,双击exe即可启动流程,总的说来,我那个流程的方法论是这样的:通过介面获取需要辨识的相片或者截图,然后后端初始化腾讯文本辨识USB辨识文本,然后将返回结果呈现在介面的文本编辑器上,由于采用的是腾讯的USB,辨识准确率实测相当高(速度要取决于网速和相片内容)。大致是这样,有时间我还可以把介面的方法论实现具体写一下。

作者 nasiapp

在线客服
官方客服
我们将24小时内回复。
12:01
您好,有任何疑问请与我们联系!

选择聊天工具: