翻转外语——自动化脚本100%正确率-基于paddleocr和opencv以及pyautogui自
自动翻转卡包和拼写均已实现,剩下的点听力,阅读,语法,较为简单(如需要请自行增补代码)ps: 使用雷电模拟器
这里提供的代码重要是思绪,直接粘贴复制是用不了的(因为缺少相关情况和python的模块包)
https://i-blog.csdnimg.cn/blog_migrate/a8bbaecb9e234ee9d2bf5a75f9bd43b5.png
https://i-blog.csdnimg.cn/blog_migrate/27c1e0b9917fef0bec22bf19fe970ab7.png
实现自动拼写:
import pyautogui,time,logging,re
from paddleocr import PaddleOCR
pyautogui.PAUSE = 0.1
time.sleep(1)
img_path="pinxie.png"
##定位键盘,这个x,y很重要,定位全局。(尽量别修改)
x,y=pyautogui.locateCenterOnScreen(img_path,region=(0,0,500,900),confidence=0.8)##左半屏
##可以不带region参数 x,y=pyautogui.locateCenterOnScreen(img_path,confidence=0.8)##全屏寻找
print(x,y)
keyboard_layout = {
'q': (x-365, y-196), 'w': (x-320, y-196), 'e': (x-275, y-196), 'r': (x-230, y-196), 't': (x-185, y-196),
'y': (x-140, y-196), 'u': (x-95, y-196), 'i': (x-50, y-196), 'o': (x-5, y-196), 'p': (x+40, y-196),
'a': (x-340, y-136), 's': (x-295, y-136), 'd': (x-250, y-136), 'f': (x-205, y-136), 'g': (x-160, y-136),
'h': (x-115, y-136), 'j': (x-70, y-136), 'k': (x-25, y-136), 'l': (x+20, y-136),
'z': (x-300, y-76), 'x': (x-255, y-76), 'c': (x-210, y-76), 'v': (x-165, y-76), 'b': (x-120, y-76),
'n': (x-75, y-76), 'm': (x-30, y-76)
}
#这里的坐标不要修改,我调好的参数。
##这里是主体部分
while True:##一般这里就是二十五个循环(25个单词拼写)
def type_text(text):
for char in text:
if char in keyboard_layout:
x, y = keyboard_layout
pyautogui.click(x, y)
# 模拟第一次输入
type_text("qwertyuipoiuy")
pyautogui.click(x, y)
time.sleep(0.5)
##截取单词
pyautogui.screenshot("danci.png", (int(x - 360), int(y - 536), 380, 250))
danci = []
##识别单词
logging.disable(logging.DEBUG)
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(f"danci.png", cls=True)
for idx in range(len(result)):
res = result
for line in res:
danci.append(line)
# 将列表转换为一个字符串
string = ''.join(danci)
# 定义正则表达式模式,匹配 "提示" 后面的单词
pattern = re.compile(r'提示(\w+)')
# 使用正则表达式进行匹配
match = pattern.search(string)
result = match.group(1) # <---这个就是识别出来的正确答案
print(result) #打印出来方便观察的(可以删)
##以上为识别单词(识别结束)
# 现在可以点击删除键清空单词
pyautogui.click(x + 20, y - 76)
# 现在开始输入单词
type_text(result)
pyautogui.click(x, y)
time.sleep(1) #延迟函数(很重要)可以根据你的电脑调整时间,但是不要删除(给截屏反应时间的),因为那个页面跳转会有0.3秒的时间响应 思绪都写在注释里了
自动翻转卡包:
import logging,re,Levenshtein
import pyautogui,time
from paddleocr import PaddleOCR, draw_ocr
li=[]##识别表
li1=[]##对比表1
li22=[]##对比表22
def ocrbaocun(): ##识别保存后正则化 为对比表1
li=[]
li1=[]##初始化列表为空,防止混淆
pp=0
while True:
if (pp==5):
break
time.sleep(1.5)
img_path = "shibie.png"
x, y = pyautogui.locateCenterOnScreen(img_path, region=(0, 0, 400, 800), confidence=0.7)
pyautogui.click(x, y + 200)
time.sleep(1.5)
pyautogui.screenshot(f"shot{pp+1}.png", (int(x - 235), int(y - 160), 350, 370))
##开始识别翻译的截屏
logging.disable(logging.DEBUG)
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(f"shot{pp+1}.png", cls=True)
for idx in range(len(result)):
res = result
str1 = ""
for line in res:
str1 += line
pp += 1
# 按住鼠标左键
pyautogui.mouseDown(button='left')
# 向上滑动
pyautogui.moveRel(0, -100, duration=0.2)# 这里的100可以调整,表示滑动的距离
# 释放鼠标左键
pyautogui.mouseUp(button='left')
li.append(str1)
print(li)
#正则表达式
pattern = re.compile(r'(?<!)\b(?!vt|n|adj|adv)+\b|[\u4e00-\u9fa5]+')
# 遍历列表中的每个元素
for text in li:
# 使用findall方法匹配文本中的单词
matches = pattern.findall(text)
# 输出匹配到的单词
li1.append(matches)
time.sleep(2)
print(li1)
for i in range(5):
ocrchoice(li1)
def ocrchoice(li1):
time.sleep(1.5)
li2=[]
li22=[]
elect_path = "choice.png"
x, y = pyautogui.locateCenterOnScreen(elect_path, confidence=0.7, region=(0, 0, 400, 800))
pyautogui.screenshot("choicejietu.png", (int(x - 200), int(y + 100), 390, 270))
logging.disable(logging.DEBUG)
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(f"choicejietu.png", cls=True)
for idx in range(len(result)):
res = result
for line in res:
li2.append(line)
pattern = re.compile(r'[\u4e00-\u9fa5]+')
for text in li2:
matches = pattern.findall(text)
li22.append(matches)
print(li22)
##从这里开始选择
decide(x,y,li1,li22)
def decide(x,y,li1,li22):
flat_list1 =
# 设置相似度阈值
immediate_threshold = 0.7
def are_similar(str1, str2):
return Levenshtein.ratio(str1, str2)
# 找到第二个双层列表中包含相似元素的子列表的相似度最大索引
max_similarity = 0
matching_index = -1
immediate_found=False
for idx, sublist in enumerate(li22):
for item in sublist:
for flat_item in flat_list1:
similarity = are_similar(item, flat_item)
print(f"Comparing '{item}' with '{flat_item}', similarity: {similarity}")
if similarity >= immediate_threshold:
print(f"Found immediate match with similarity {similarity} at index {idx}")
matching_index=idx
max_similarity=similarity
immediate_found=True
break
if similarity > max_similarity:
max_similarity = similarity
matching_index = idx
if immediate_found:
break
if immediate_found:
break
print(f"Matching index: {matching_index}, max similarity: {max_similarity}")
#以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接结束比对(一般都是1.0的相似度)。
#如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。
if(matching_index==0):
pyautogui.click(x + 150, y + 130)##A
if(matching_index==1):
pyautogui.click(x + 150, y + 200)##B
if(matching_index==2):
pyautogui.click(x + 150, y + 270)##C
if(matching_index==3):
pyautogui.click(x + 150, y + 340)##D
time.sleep(0.5)
# 按住鼠标左键
pyautogui.mouseDown(button='left')
# 向上滑动
pyautogui.moveRel(0, -100, duration=0.2)# 这里的100可以调整,表示滑动的距离
# 释放鼠标左键
pyautogui.mouseUp(button='left')
time.sleep(1.5)
while True:
ocrbaocun()
time.sleep(1) 简单解说下卡包的思绪:
https://i-blog.csdnimg.cn/blog_migrate/8c4140299b6ea23a2c245977bbbed21d.png
列表里的1,2,3,4,5是分别五个单词的翻译及其单词(还没有正则化)五个字符串在一个列表中往后累加的,以是后面也是一样的形式
白色框:是正则化(re)后的每个单词及其翻译
绿色框(每个单词都是这样的):是第一个的单词的选择(A,B,C,D),显而易见也是已经经过 正则化。
https://i-blog.csdnimg.cn/blog_migrate/b16c2729017faaaf2ea4e348ee0027d5.png
选择思绪:
https://i-blog.csdnimg.cn/blog_migrate/921484fb3b0ed57a5822af4ef6c05853.png
判断相似度:
以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接竣事比对(一般都是1.0的相似度)如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。
Matching index就是选项,0,1,2,3分别对应A,B,C,D.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]