小袁口算python
洛兰白芷 2024-10-15 08:05:01 阅读 76
pyhton纯视觉方案,按照模拟器位置捕捉截图进行比较,为两张截图方案,自行更改位置,需要下载pytesseract ocr到本机,同时需更改捕捉屏幕的区域,go字样的区域,仅供学习,刷速度此方案不可行
<code>import cv2
import pytesseract
import pyautogui
import numpy as np
import time
from concurrent.futures import ThreadPoolExecutor
# Tesseract OCR路径配置
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def capture_screenshot(region=None):
# 捕捉屏幕截图
screenshot = pyautogui.screenshot(region=region) # 捕捉指定区域
img = np.array(screenshot) # 转换为numpy数组
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # 转换为BGR格式
return img
def extract_text_from_image(img):
# 图像中提取文本
custom_config = r'--oem 3 --psm 6' # Tesseract配置
text = pytesseract.image_to_string(img, config=custom_config)
print("识别出的文本:", text) # 调试输出
return text.strip()
def wait_for_go(region):
# 等待识别到go字样后继续执行
print("等待识别到 'go' 字样...")
while True:
img = capture_screenshot(region)
text = extract_text_from_image(img)
if 'go' in text.lower(): # 如果识别到 "go",开始执行主程序
print("'go' 已识别,开始执行主程序")
break
time.sleep(0.1) # 每秒检查一次
def extract_number_from_image(img):
# 从图像中提取数字
custom_config = r'--oem 3 --psm 6 outputbase digits' # Tesseract配置
details = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT, config=custom_config)
# 提取识别出的文本信息
numbers = []
for i, text in enumerate(details['text']):
if text.isdigit(): # 只提取数字
numbers.append(int(text))
print("提取的数字:", numbers) # 调试输出
return numbers
def draw_comparison_sign(result, start_position):
# 模拟鼠标滑动绘制比较符号
pyautogui.moveTo(start_position[0], start_position[1]) # 移动到起始位置
# 绘制符号
if result == ">":
# 绘制大于号
pyautogui.dragTo(210, 710, button='left', duration=0.00001) # 上半部分code>
pyautogui.dragTo(200, 720, button='left', duration=0.00001) # 下半部分code>
elif result == "<":
# 绘制小于号
pyautogui.dragTo(190, 710, button='left', duration=0.00001) # 上半部分code>
pyautogui.dragTo(200, 720, button='left', duration=0.00001) # 下半部分code>
def process_image(region):
# 捕捉图像并提取数字
img = capture_screenshot(region)
numbers = extract_number_from_image(img)
return numbers
def main(region1, region2):
#主循环 捕捉、识别、比较并绘制符号
iterations = 13 # 设定循环次数
with ThreadPoolExecutor(max_workers=2) as executor: # 创建线程池,设置2个并发工作线程
for i in range(iterations):
# 使用线程并行处理两个图像捕捉与数字提取
future1 = executor.submit(process_image, region1)
future2 = executor.submit(process_image, region2)
# 获取提取结果
numbers1 = future1.result()
numbers2 = future2.result()
if len(numbers1) > 0 and len(numbers2) > 0:
num1 = numbers1[0] # 假设第一张图像提取第一个数字
num2 = numbers2[0] # 假设第二张图像提取第一个数字
print(f"第一张识别到数字: {num1},第二张识别到数字: {num2}")
# 比较数字并绘制符号
if num1 > num2:
draw_comparison_sign(">", (200, 700)) # 在指定位置绘制大于号
elif num1 < num2:
draw_comparison_sign("<", (200, 700)) # 在指定位置绘制小于号
else:
print("两个数字相等,无需绘制符号。")
time.sleep(0.3) # 暂停0.5秒再进行下一次截图
# 示例:定义捕捉屏幕的区域
region1 = (100, 300, 100, 100) # 第一张图像捕捉区域 (x, y, width, height)
region2 = (290, 310, 100, 100) # 第二张图像捕捉区域 (x, y, width, height)
# 定义 'go' 字样的区域
go_region = (190, 425, 120, 65) # 假设 'go' 字样出现在这个区域 (x, y, width, height)
# 等待识别到 'go' 字样后启动主程序
wait_for_go(go_region)
# 启动主程序
try:
main(region1, region2)
except KeyboardInterrupt:
print("程序已停止")
except Exception as e:
print("发生错误:", e)
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。