系统:Linux Mint 18.3 xfce 64bit
参考链接:http://blog.youkuaiyun.com/u012236875/article/details/74726035
根据参考链接的代码,简单做了个GUI界面的python程序。
关于图片转换,网上还有很多关于使用pytesseract的例子,但自己试了一下中文识别率并没有百度提供的文字识别接口高,因此使用百度的API。本例子是在linux下实现的,调用了linux下的一个截图工具scrot
,如果是windows下可以参考网上用python实现的截图功能。
(0) pip install baidu-aip
(1)使用qtdesigner设计UI界面,类似下图
(2)去百度云(不是百度网盘)注册后创建一个文字识别应用,创建后会有APPID,API key以及密钥等信息,接下来要用
(3)参考下列代码,其中截图功能使用scrot,API参数还是硬编程
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: ouening
使用PyQt5调用百度API构建图片转文字的GUI程序
"""
import sys
import os
import time
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QMessageBox
from PyQt5.QtWidgets import QFileDialog, QAction, qApp
from PyQt5.QtGui import QIcon, QPixmap
import pygame
#from PIL import ImageGrab
from aip import AipOcr # 导入百度API
## 百度API参数
APP_ID = '9851066'
API_KEY = 'LUGBatgyRGoerR9FZbV4SQYk'
SECRET_KEY = 'fB2MNz1c2UHLTximFlC4laXPg7CVfyjV'
# 初始化文字识别
aipOcr = AipOcr(APP_ID, API_KEY, SECRET_KEY)
options = {
'detect_direction':'true',
'language_type':'CHN_ENG'}
# 使用QtCreator建立的ui文件路径
qtCreatorFile = "/home/kindy/Files/python/gui/pyqt/baiduapi-ocr.ui"
# 使用uic加载
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
# 读取图片
def getImageBytes(filename):
with open(filename,'rb') as fp:
return fp.read()
class MyApp(QMainWindow, Ui_MainWindow):
def __init__(self):
QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
super().__init__()
self.initUI() # 调用自定义的UI初始化函数initUI()
def initUI(self):
'''
Initialize the window's UI
'''
self.setupUi(self)
self.setWindowTitle("图片转文字GUI程序")
self.setWindowIcon(QIcon("/home/kindy/Files/python/gui/pyqt/rocket.png")) # 设置图标,linux下只有任务栏会显示图标
self.initMenuBar() # 初始化菜单栏
self.initToolBar() # 初始化工具栏
self.initButton() # 初始化按钮
self.show() # 显示
def initMenuBar(self):
'''
初始化菜单栏
'''
menubar = self.menuBar()
#self.actionExit.triggered.connect(qApp.quit) # 按下菜单栏的Exit按钮会退出程序
#self.actionExit.setStatusTip("退出程序") # 左下角状态提示
#self.actionExit.setShortcut('Ctrl+Q') # 添加快捷键
exitAct = QAction(QIcon('/home/kindy/Files/python/gui/pyqt/exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
fileMenu = menubar.addMenu('&Help')
def initToolBar(self):
'''
初始化工具栏
创建一个QAction实例exitAct,然后添加到designer已经创建的默认的工具栏toolBar里面
'''
exitAct = QAction(QIcon('/home/kindy/Files/python/gui/pyqt/exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
self.toolBar.addAction(exitAct)
def initButton(self):
'''
Initialize the Buttons
btnBrowse: browse the file explorer
btnPlay: begin to play music using module pygame
btnStop: stop playing music
'''
self.btnBrowse.clicked.connect(self.browserButton_callback) # 按下按钮调用回调函数
self.btnBrowse.setToolTip("浏览需要转换的文件") # 设置提示
#self.btnBrowse.setStyleSheet("{border-image: url(/home/kindy/Files/python/gui/pyq/play.ico);}") # 此代码没有效果
self.btnScreen.clicked.connect(self.screenButton_callback) # 一旦按下按钮,连接槽函数进行处理
self.btnScreen.setToolTip("截取屏幕文字")
self.btnConvert.clicked.connect(self.convertButton_callback)
self.btnConvert.setToolTip("转换图片中的文字")
def browserButton_callback(self):
global fileName1 # 设置全局
fileName1, filetype = QFileDialog.getOpenFileName(self,
"选取图片文件",
"/home/kindy/图片",
"All Files (*);;Music Files (*.png)") #设置文件扩展名过滤,注意用双分号间隔
self.filePath.setText(fileName1)
def screenButton_callback(self):
filename = r'/home/kindy/图片/temp.png'
start = time.time()
os.system("scrot -s %s"%(filename))
res = aipOcr.webImage(getImageBytes(filename))
txt=res['words_result']
text = str()
for i in range(len(txt)):
#scr.insert(tk.INSERT, str(txt[i]['words']) + '\n')
#self.plainTextEdit.setPlainText(str(txt[i]['words']) + '\n')
text += (str(txt[i]['words'])+ '\n')
self.plainTextEdit.setPlainText(text)
#print(text)
end = time.time()
self.plainTextEdit.setStatusTip("图片文字转换时间:%.2fs"%(end-start))
def convertButton_callback(self, filename):
'''
调用百度API进行文字识别
'''
start = time.time()
res = aipOcr.webImage(getImageBytes(fileName1))
txt=res['words_result']
text = str()
for i in range(len(txt)):
#scr.insert(tk.INSERT, str(txt[i]['words']) + '\n')
#self.plainTextEdit.setPlainText(str(txt[i]['words']) + '\n')
text += (str(txt[i]['words'])+ '\n')
self.plainTextEdit.setPlainText(text)
print(text)
end = time.time()
self.plainTextEdit.setStatusTip("图片文字转换时间:%.2fs"%(end-start))
#def closeEvent(self, event):
#reply = QMessageBox.question(self, 'Message',
#"Are you sure to quit?", QMessageBox.Yes |
#QMessageBox.No, QMessageBox.No)
#if reply == QMessageBox.Yes:
#event.accept()
#else:
#event.ignore()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyApp()
sys.exit(app.exec_())
效果如下:
截图功能调用linux系统的截图软件scrot
,转换时间和网络有关,也和转化的文字图片有关(不过感觉听慢的。。。,先暂时用着先)