Linux python PyQt5调用百度API实现图片文字转换

32 篇文章 1 订阅

系统:Linux Mint 18.3 xfce 64bit

参考链接:http://blog.csdn.net/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 ,转换时间和网络有关,也和转化的文字图片有关(不过感觉听慢的。。。,先暂时用着先)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值