小猿口算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图片识别,识别后会进行大小的比较,最后模拟指针移动,在模拟器的屏幕中,绘制出对应的大于号或者小于号。一直循环。
上一篇: 【C++动态库】动态库隐式与显式加载 | 为什么要动态加载动态库 | LoadLibrary加载失败 | 参考开源操作系统ReactOS源码 | 用LoadLibraryEx替代LoadLibrary
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。