翻转外语——自动化脚本100%正确率-基于paddleocr和opencv以及pyautogui自动化实现。

自动翻转卡包和拼写均已实现,剩下的点听力,阅读,语法,较为简单(如需要请自行补充代码)

ps: 使用雷电模拟器

这里提供的代码主要是思路,直接粘贴复制是用不了的(因为缺少相关环境和python的模块包)

实现自动拼写:

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[char]
                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[idx]
        for line in res:
            danci.append(line[1][0])
            # 将列表转换为一个字符串
    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[idx]
            str1 = ""
            for line in res:
                str1 += line[1][0]
        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'(?<![A-Z])\b(?!vt|n|adj|adv)[a-zA-Z]+\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[idx]
        for line in res:
            li2.append(line[1][0])
    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 = [item for sublist in li1 for item in sublist]

    # 设置相似度阈值
    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)

简单讲解下卡包的思路:

列表里的1,2,3,4,5是分别五个单词的翻译及其单词(还没有正则化)五个字符串在一个列表中往后累加的,所以后面也是一样的形式

白色框:是正则化(re)后的每个单词及其翻译

绿色框(每个单词都是这样的):是第一个的单词的选择(A,B,C,D),显而易见也是已经经过 正则化。

选择思路:

判断相似度:

以上有两种匹配方案,如果有相似度>=0.8的子列表,就直接结束比对(一般都是1.0的相似度)如果没有>=0.8的,就比对所有字符串后取最大相似度所在的子列表索引。

Matching index就是选项,0,1,2,3分别对应A,B,C,D.

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值