小猿口算Pk基础版

liyunlong-java 2024-10-26 11:05:01 阅读 56

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

主要python 源程序

<code>

```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)code>

right_text = pytesseract.image_to_string(processed_right, lang="eng", config=config)code>

# 修改:保留原始结果并进行纠正

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图片识别,识别后会进行大小的比较,最后模拟指针移动,在模拟器的屏幕中,绘制出对应的大于号或者小于号。一直循环。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。