首页 > Python资料 博客日记

小猿口算Pk基础版

2024-10-27 08:00:05Python资料围观47

这篇文章介绍了小猿口算Pk基础版,分享给大家做个参考,收藏Python资料网收获更多编程知识

小猿口算pk(分数和整数)基础版

主要python 源程序


```python
import time
import pytesseract
from PIL import Image, ImageEnhance, ImageFilter, ImageOps
import re
import subprocess

def preprocess_image(image):
    # 将图像转换为灰度图
    image = image.convert('L')

    # 增强对比度
    enhancer = ImageEnhance.Contrast(image)
    image = enhancer.enhance(3.0)

    # 二值化处理
    image = image.point(lambda p: p > 128 and 255)

    # 锐化图像
    image = image.filter(ImageFilter.SHARPEN)

    # 使用高斯模糊去除噪声
    image = image.filter(ImageFilter.GaussianBlur(radius=0.58))

    return image
def split_image(image):
    # 获取图像的宽度和高度
    width, height = image.size
    mid_x = width // 2
    return image.crop((0, 0, mid_x, height)), image.crop((mid_x, 0, width, height))


def extract_number(text):
    decimal_pattern = r'[-+]?\d*\.?\d+([eE][-+]?\d+)?'
    fraction_pattern = r'[-+]?\d+/\d+'

    # 优先匹配分数
    fraction_match = re.search(fraction_pattern, text)
    decimal_match = re.search(decimal_pattern, text)

    # 处理特殊情况:避免识别出1/1或1的情况
    if fraction_match:
        fraction_text = fraction_match.group()
        # 如果分子是1,尝试获取分母是否有意义
        if fraction_text.startswith('1/'):
            return fraction_text  # 保留分数形式,稍后处理
        else:
            return fraction_text

    return decimal_match.group() if decimal_match else None


def parse_number(number_str):
    if '/' in number_str:
        numerator, denominator = map(int, number_str.split('/'))
        return numerator / denominator
    return float(number_str)


def correct_ocr_result(text):
    # 纠正混淆:避免将0错误地替换为9
    if text.count('0') > text.count('9'):
        corrected_text = text.replace('9', '0')  # 只在确认是0的情况下进行替换
    else:
        corrected_text = text

    # 修复分子为1、2和5的错误
    corrected_text = re.sub(r'(?<!\d)1/', '1/', corrected_text)  # 保留1作为分子
    corrected_text = re.sub(r'(?<!\d)2(?!\d)', '2', corrected_text)  # 保留2
    corrected_text = re.sub(r'(?<!\d)5(?!\d)', '5', corrected_text)  # 保留5

    # 添加逻辑以纠正可能的混淆
    # 示例:如果上下文中出现了5和2的混淆,增加一些逻辑来决定
    if '5' in corrected_text and '2' in corrected_text:
        # 比较出现的次数,或上下文来判断是否混淆
        if corrected_text.count('5') > corrected_text.count('2'):
            corrected_text = corrected_text.replace('2', '5')  # 作为示例,可以进行调整
        elif corrected_text.count('2') > corrected_text.count('5'):
            corrected_text = corrected_text.replace('5', '2')  # 作为示例,可以进行调整

    return corrected_text


def execute_adb_command(command):
    subprocess.run(command, shell=True)


def run_test_script():
    subprocess.run("E:\\screenshot_and_crop.bat", shell=True)


def process_image(image_path):
    original_image = Image.open(image_path)
    left_half, right_half = split_image(original_image)
    processed_left = preprocess_image(left_half)
    processed_right = preprocess_image(right_half)

    # 使用Tesseract进行OCR
    config = '--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789./ '
    left_text = pytesseract.image_to_string(processed_left, lang="eng", config=config)
    right_text = pytesseract.image_to_string(processed_right, lang="eng", config=config)

    # 修改:保留原始结果并进行纠正
    left_text = correct_ocr_result(left_text.strip().replace('\n', '/'))
    right_text = correct_ocr_result(right_text.strip().replace('\n', '/'))

    return left_text, right_text


def main_loop(image_path):
    while True:
        try:
            run_test_script()  # 启动截图脚本
            left_text, right_text = process_image(image_path)

            left_number = extract_number(left_text)
            right_number = extract_number(right_text)

            print("左半部分:", left_text)
            print("右半部分:", right_text)
            print("左边提取的数字:", left_number)
            print("右边提取的数字:", right_number)

            if left_number and right_number:
                left_value = parse_number(left_number)
                right_value = parse_number(right_number)

                print(f"左边数值: {left_value}")
                print(f"右边数值: {right_value}")

                if left_value > right_value:
                    print("左边大于右边")
                    execute_adb_command(
                        "adb shell \"input touchscreen swipe 443 1222 697 1400; input touchscreen swipe 697 1400 447 1430\"")
                elif left_value < right_value:
                    print("左边小于右边")
                    execute_adb_command(
                        "adb shell \"input touchscreen swipe 586 1277 355 1373; input touchscreen swipe 355 1373 611 1486\"")

            # time.sleep(0.01)  # 控制循环频率
        except Exception as e:
            print(f"发生错误: {e}")

        # 每次循环后等待0.2秒
        time.sleep(0.45)


if __name__ == '__main__':
    image_path = "E:\\screenshots\\xiaoyuan.png"
    main_loop(image_path)

使用Mumu 模拟器,在安卓模拟器设置中,手机获取root,开启abd调试(默认开启)

下载小袁口算apk文件,双击安装到Mumu 安卓模拟器中

下载adb 到电脑中,并配置环境变量(系统变量path中添加adb的安装路径)

mumu 模拟器的端口号为7555 ,在命令行中,输入 adb connect 127.0.0.1:7555 连接模拟器,使用adb get-state 检查是否连接成功,输出device,则表示连接成功

使用下面的脚本 进行屏幕的截取(默认存储在模拟器分配的存储空间中,因此需要拷贝到你的电脑存储中)

@echo off
:: 截取屏幕并保存到设备
adb shell screencap -p /sdcard/screenshot.png

:: 将截图从设备拉取到本地
adb pull /sdcard/screenshot.png E:\screenshots\screenshot.png

:: 使用 ImageMagick 裁剪指定区
magick E:\screenshots\screenshot.png -crop 810x360+140+380 E:\screenshots\xiaoyuan.png

:: 输出完成信息
echo 

当图片传到电脑中的实际存储空间中后,在python源程序中,修改自己的照片存储路径,这里使用的是ocr图片识别,识别后会进行大小的比较,最后模拟指针移动,在模拟器的屏幕中,绘制出对应的大于号或者小于号。一直循环。



版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐