[从零开始]用python制作识图翻译器·三
AlsoEasy-RecognitionTranslator
- 具体实现
- 开发环境准备和验证
- 下载conda
- 创建开发环境
- 文字识别模块
- 在线模块
- 离线模块
- 机器翻译模块
- 在线模块
- 离线模块
- GUI
- GUI-定位模块
- GUI-截图模块
具体实现
开发环境准备和验证
前期测试项目文件已上传到我的仓库。
下载conda
conda是python的版本管理工具,因为不同库要求的python版本不一样,非常容易起冲突,所以建议装个conda来管理不同的生产环境,这里就偷个懒贴别人的安装教程了。
创建开发环境
cmd运行如下命令:
conda create -n test python==3.7.2
键入y并回车。
完成后cmd运行如下命令,进入测试环境(前面有环境名即进入了相应环境):
conda activate test
后面如果使用pip命令时出现"runtime out"错误,建议使用换源命令下载,以豆瓣换源下载torch为例:
pip install --index-url https://pypi.douban.com/simple torch
文字识别模块
在线模块
使用百度的开放接口。虽然是免费的,但需要按照参考教程注册开发者帐号并申请调用权限,获取"APP_ID"、“API_KEY”、"SECRET_KEY"三个关键字。做完以上操作以后,在开发环境中使用pip命令添加依赖:
pip install baidu-aip
pip install chardet
然后用如下代码测试一下接口能否正常使用吧,将如下代码保存为py文件,并在cmd中相应目录下用python命令运行:
from aip import AipOcrconfig = {'BAIDU_OCR_APP_ID': '', # 这里写自己的 APP_ID'BAIDU_OCR_API_KEY': '', # 这里写自己的 API_KEY'BAIDU_OCR_SECRET_KEY': '' # 这里写自己的 SECRET_KEY
}
path = 'D:\pybox\folder\test\example1.jpg' # 写上你要检测图片的绝对地址# 下面的部分都不用动,检测的语言类型的关键字可以根据你检测图片的文字做变换
LANS = ['CHN_ENG','ENG','JAP','KOR'] # 记录语言类型的关键字
default_options = { # 这里是一些检测选项"language_type": "JAP", # 检测的语言类型,JAP表示日文"detect_direction": "false", # 是否检测语言方向"detect_language": "true", # 是否检测语言类型"paragraph": "false", # 是否输出段落信息"probability": "false" # 是否返回每段置信度
}client = AipOcr(config['BAIDU_OCR_APP_ID'], config['BAIDU_OCR_API_KEY'], config['BAIDU_OCR_SECRET_KEY']
)with open(path, 'rb') as f:result = client.basicGeneral(f.read(), default_options)
print(result)
这里提供一张样图和相应的测试结果
离线模块
使用easyOCR模型,这个模型对游戏文本框这种文字明晰的简单环境识别率高,识别速度快。唯一比较麻烦的是初次使用需要下载模型。使用pip命令添加依赖:
pip install easyocr
如果出现"runtime out"错误,记得使用换源命令下载:
pip install --index-url https://pypi.douban.com/simple easyocr
如果模型下载得太慢了可以到我的百度里下载备份,提取码:vci8。
测试代码如下:
import easyocr
import os
__PATH__ = os.path.dirname(os.path.abspath(__file__))
__MODEL_PATH__ = os.path.join(__PATH__, '../model')
# ch_tra 繁体
LANS = ['ch_sim','en','ja','ko']
path = r'D:\pybox\folder\test\example4.jpg' # 这里写自己测试图片的绝对路径client = easyocr.Reader(lang_list = ['en','ja'], # 识别语言,可多项download_enabled = True, # 自动下载模型model_storage_directory = __MODEL_PATH__ # 设置模型保存路径
)
result = client.readtext(path)
print(result)
此处同样提供一张测试图样和测试结果:
当然离线ocr模块也可以选择pp-ocr,虽然pp-ocr的功能十分强大并且识别率也是极高,但是pp-ocr的依赖十分复杂并且需要手动选择复杂模型,过程比较繁琐,故不推荐。
tesseractOCR因为有python版本冲突、识别率较低等问题故不作考虑。
机器翻译模块
在线模块
在线翻译同样选择百度的百度翻译(百度真好用!)。同样需要我们按照百度的官方教程申请权限,获取"appid"和"SECRET_KEY"关键字。
因为百度翻译的api使用的网络请求接口的方式,故不需要再添加依赖,直接调用如下测试代码:
# API文档地址: https://fanyi-api.baidu.com/product/113
import hashlib
import json
from random import randint
import time
import urllib.request
import urllib.parseMAX_RESP_TIME = 5 # 超时最大重传数
REQUEST_FAILED = -1 # 请求失败码
LANS = ['auto','zh','en','jp','kor'] # 语言类型关键字
encoding = 'utf-8' # 编码用utf-8SECRET_KEY = '' # 填上自己的SECRET_KEY
options = {'appid': '', # 填上自己的APP_ID'salt': '777', # 只是一个随机数,用于和sign进行验证'from': 'en', # 源语言类型,自己根据翻译内容做修改'to': 'zh', # 目标语言类型,自己根据翻译内容做修改'q': '', # 翻译的文本内容'sign': '' # 数字签名
}def trans(content, lfrom):url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'options['q'] = contentoptions['from'] = lfromoptions['sign'] = getMD5(options['appid'] + content + options['salt'] + SECRET_KEY)html = getTranslateResponce(url, options)res = json.loads(html)i = 0 while i < MAX_RESP_TIME:if res.get('error_code') != REQUEST_FAILED:breaki += 1print('本次请求失败,原因为:', res['error_msg'])time.sleep(1)html = getTranslateResponce(url, options)res = json.loads(html)print(res)# md5加密生成数字签名sign
def getMD5(content):return hashlib.md5(content.encode(encoding)).hexdigest()# 发送http网络接口请求
def getTranslateResponce(url, data):data = urllib.parse.urlencode(data).encode(encoding)response = urllib.request.urlopen(url, data)return response.read().decode(encoding)test_text_en = 'A secret makes a woman woman.'
test_text_jp = '真実はいつもひとつ。'
trans(test_text_en, 'en')
trans(test_text_jp, 'jp')
得到结果:
离线模块
在github上搜索“offline translate”,直接找高星项目。发现argos-translate简单好用,故冲之。
按照代码仓库readme的教程,pip下载依赖。
pip install argostranslate
当然因为是离线的,同样也需要下载模型。不过可以直接用代码中下载,下载速度也很快:
# API文档地址: https://github.com/argosopentech/argos-translate
# 模型下载地址:https://www.argosopentech.com/argospm/index/
from email.policy import default
from argostranslate import package, translate# 中-3 英-0 日-16 韩-17
LANS = [3, 0, 16, 17]
MIDDLEWARE = 0 # 中间转换语言
options = {'from': LANS[2],'to': LANS[0]
}
translation = [None, None]
client = translate.get_installed_languages() # 下载语言包
print(package.get_available_packages()) # 查看能用的语言包
# 因为都是某语言译英或者英译某语言,所以如果源语言和目标语言不包含英语时需要进行二次转换
def trans(content):if options['from'] == MIDDLEWARE | options['to'] == MIDDLEWARE:translation[0] = client[options['from']].get_translation(client[options['to']])return translation[0].translate(content)else:translation[0] = client[options['from']].get_translation(client[MIDDLEWARE])translation[1] = client[MIDDLEWARE].get_translation(client[options['to']])mid = translation[0].translate(content)return translation[1].translate(mid)result = trans('真実はいつもひとつ。')
print(result)
注意:argostranslate只支持某译英或英译某,所以在源语言和目标语言中不含英语时,需要先翻译成英语再翻译成目标语言。因此日译汉时会出现不小的精度损失。
GUI
前文已经解释过选择pyqt而非wxpython的原因。直接pip添加GUI的依赖:
pip install PyQt5
测试代码如下:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit
import PyQt5.QtWidgets as QT# 应用
app = QApplication([])# 绘制窗口
window = QMainWindow()
window.resize(500, 400)
window.move(300, 310)
window.setWindowTitle('薪资统计')textEdit = QPlainTextEdit(window)
textEdit.setPlaceholderText("请输入薪资表")
textEdit.move(10,25)
textEdit.resize(300,350)button = QPushButton('统计', window)
button.move(380,80)# 事件注册
def handleCalc():window.close()
button.clicked.connect(handleCalc)# 窗口显示
window.show()
app.exec_()
演示结果(这只是一个简单的demo,点击统计按钮窗口就会关闭):
GUI-定位模块
import sys,math
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *class Drawing(QWidget):def __init__(self, parent = None):super(Drawing, self).__init__(parent)self.resize(600,400)self.setWindowTitle('拖拽绘制矩形')self.rect = None#重写绘制函数def paintEvent(self, event):#初始化绘图工具qp = QPainter()#开始在窗口绘制qp.begin(self)#自定义画点方法if self.rect:self.drawRect(qp)#结束在窗口的绘制qp.end()def drawRect(self, qp):#创建红色,宽度为4像素的画笔pen = QPen(Qt.red, 4)qp.setPen(pen)qp.drawRect(*self.rect)#重写三个时间处理def mousePressEvent (self, event):print("mouse press")self.rect = (event.x(), event.y(), 0, 0)def mouseReleaseEvent (self, event) :print("mouse release")def mouseMoveEvent(self, event):start_x, start_y = self.rect[0:2]self.rect = (start_x, start_y, event.x() - start_x, event.y() - start_y)self.update()if __name__ == '__main__':app=QApplication(sys.argv)demo=Drawing()demo.show()sys.exit(app.exec_())
测试效果(在窗口内用鼠标拖拽绘制矩形):
GUI-截图模块
from PIL import ImageGrab
import os
__dir__ = os.path.dirname(os.path.abspath(__file__))
__cache_path__ = os.path.join(__dir__, '../shot_cache.jpg')position = [100, 0, 500, 1000] # 左上右下定位# 开始截图
def capturePhoto(position):# 左上右下img = ImageGrab.grab(position)img.save(__cache_path__)return imgimg = capturePhoto(position)
# 显示截图
img.show()
测试效果:
[从零开始]用python制作识图翻译器·三相关推荐
- [从零开始]用python制作识图翻译器·二
AlsoEasy-RecognitionTranslator 需求分析 系统分析 功能拆解 工程语言选择 技术可行性分析 具体实现 需求分析 见上篇[从零开始]用python制作识图翻译器·一 上 ...
- [从零开始]用python制作识图翻译器·一
AlsoEasy-RecognitionTranslator 前言 需求分析 应用场景 需求提取 需求补充 竞品分析 QQ识图 百度翻译 UU翻译器 小结 功能实现 前言 这是我的毕设作品.当时玩 ...
- [从零开始]用python制作识图翻译器·四
具体实现 整个工程文件已经上传到我的代码仓库. 正式开始 项目结构 数据存储 因为本系统为自用而非商用,并且偏向功能性,所以直接用一个config.json文件保存所有的用户数据,就不用 ...
- [从零开始]用python制作识图翻译器·五
测试 通过以上步骤我们终于实现了系统,现在到了紧张刺激的测试环节.直接运行run.py文件: python run.py ::注意需要进入conda环境 稍作等等,我们的系统就运行啦(啵唧啵唧). ...
- python图像识别生成矢量图_使用python制作矢量图
Get一个使用python制作矢量图的新技能: 前言: Matplotlib远比我们想象的强大,而这只是众多python强大的包中的一个,不愧是群英荟萃. 绘图后端我们一般是看不见的,matplotl ...
- python多张图片合并拼接,python制作sprite图、雪碧图
python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...
- Python 制作迷宫游戏(三)——地图精灵
Python 制作迷宫游戏(三)--地图精灵 上一节我们已经成功的生成了一个游戏窗口 这一节我们将试着把地图的瓦片与地图数组绑定并绘制到窗口中 当然,作为一个迷宫,地图的作用不仅仅是背景板,它最为重要 ...
- 利用Python制作动图演示坐标变换理论
利用Python制作动图演示坐标变换理论 永磁同步电机是一个非线性.强耦合的物理系统,因而不便直接进行控制.后有研究人员创造性的提出了坐标变换理论(后逐渐成为矢量控制的一个部分),让永磁同步电机得以转 ...
- python 百度识图_python如何调用百度识图api
一.先去百度识别官网注册开通服务且获得ak和sk 二.代码模板 import cv2 import base64 import requests import numpy as np import t ...
最新文章
- python做电脑软件-作为一个Python程序员,电脑上应该具备哪些软件?
- MySql 中的常见问题解决方法
- IOS可执行文件学习总结
- RFID图书管理系统程序源代码(转)
- 用计算机弹可惜不是你,可惜不是你 还是幸亏不是你
- POCO C++ Libraies介绍及常见用法
- 【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器
- java的输入输出流
- linux 编写 声卡驱动程序,在Linux中注册声卡驱动程序
- 值得注意的两个friendster新服务:校友和web共享搜索
- 金蝶K3系统如何更改已使用物料的计量单位信息
- 新西兰梅西大学有计算机专业吗,新西兰梅西大学世界排名|怎么样|入学条件_海外院校库-柳橙网...
- 一文读懂随机森林的解释和实现(附python代码)
- arp: 查看,为主机添加一个arp 表项
- 《EfficientDet:Scalable and Efficient Object Detection》论文笔记
- 在Linux平台上搭建EasyDarwin,编译代码并简单部署
- 华为防火墙实战配置教程,太全了
- Appium v1.17.1-1报错:pkg: /data/local/tmp/appium_cache/8d4156e508daae39c3f4815552e22e311432ff1f.apk
- 一张图读懂PBN旁切转弯计算
- 【亲测有效】维基百科图片不能显示
热门文章
- 基于JavaEE和SSH框架的网络阅卷任务分发系统
- 如何以 PDF/X 格式保存报表
- ROS2之OpenCV人脸识别foxy~galactic~humble
- EasyRecovery易恢复15好用的电脑数据恢复管理软件
- 仿面包旅行个人中心下拉顶部背景放大高斯模糊效果
- 三维Tensor维度分析,举例mask[0,:],mask[:,:,0],mask[:,0,:]
- xiaoxia的vim配置
- 中国运营商: 为3G快马加鞭
- mysql away,MySQL server has gone away问题及其解决
- mqtt 域名连接_Modicon M262通过MQTT连接阿里云实现