aircv 大图找小图 并识别小图中信息

本文介绍了一种基于Python的图像匹配技术,使用AirCV和PyTesseract库进行图像识别和光学字符识别(OCR)。通过匹配图像并截取特定区域,再利用OCR技术识别截图中的文本,适用于自动化操作和信息提取场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import aircv as ac
import pytesseract,pyautogui
import win32con,win32api,time,re
from ctypes import *
from PIL import Image, ImageGrab
def matchImg(imgsrc, imgobj,confidencevalue=0.8): # imgsrc=原始图像,imgobj=待查找的图片
ImageGrab.grab().save(imgsrc)
imsrc = ac.imread(imgsrc)
imobj = ac.imread(imgobj)
match_result = ac.find_template(imsrc, imobj)
#‘confidence’ 匹配相似度,rectangle:匹配图片在原始图像上四边形的坐标
#result:匹配图片在原始图片上的中心坐标点,也就是我们要找的点击点
# {‘confidence’: 0.983245, ‘rectangle’: ((394, 384), (394, 416), (450, 384), (450, 416)), ‘result’: (422.0, 400.0)}
if match_result is not None:
match_result[‘shape’] = (imsrc.shape[1], imsrc.shape[0]) # 0为高,1为宽
if int((match_result[‘confidence’])) < int(0.8):
print(“未找到目标图片”)
return match_result
#print(matchImg(imgsrc, imgobj,confidencevalue=0.5))
def main1():
imgsrc = ‘./imgsrc.png’
imgobj = ‘./firefox.png’ #以这张图片为中心
s = (matchImg(imgsrc, imgobj, confidencevalue=0.8))
print(s)
#print(s[‘rectangle’][0][0],s[‘rectangle’][0][1],s[‘rectangle’][1][0],s[‘rectangle’][1][1])
x,y,z,w =(s[‘rectangle’][0][0], s[‘rectangle’][0][1], s[‘rectangle’][2][0], s[‘rectangle’][3][1])
bbox = (x,y,z,w) #左上,左下,右上,右下
print(bbox)
bbox2 = (x+(z-x),y,z+300,w)
ImageGrab.grab(bbox).save(‘recap.png’) #按照指定坐标截图
ImageGrab.grab(bbox2).save(‘recap2.png’)
#pyautogui.moveTo(z+180,y)
main1()
def getstring(strpath):
text = pytesseract.image_to_string(Image.open(strpath))
print(text)
text2 = re.search(‘(.*/)’,text).group()
text3 = re.search(‘\d+’,text2).group()
print(“运行的圈数为%d”%int(text3))
with open(“s3log.txt”,“w+”) as f: #把圈数写入log中
f.write(text3)
f.close()
getstring(‘./recap2.png’)

ps:运行效果图在这里插入图片描述

<think>好的,用户之前询问了如何用Python实现安卓模拟器自动化脚本,我之前给出了基于PySimpleGUI和OpenCV的方案。现在用户提出想改用PyQt5作为形界面,用Airtest代替OpenCV进行识别。我需要分析用户的需求变化,调整实现方案。 首先,用户可能对之前的界面库PySimpleGUI不够满意,想要更强大或更美观的界面,PyQt5确实提供了更丰富的控件和自定义能力。另外,用户提到使用Airtest,这可能是因为Airtest在游戏自动化方面有更成熟的解决方案,内置了识别和ADB操作,比手动用OpenCV更方便,特别是在多设备管理和截处理方面。 接下来需要确认用户是否有其他隐藏需求。比如,是否希望减少自己处理识别的代码量,或者需要更好的跨设备兼容性。Airtest本身支持多设备连接和同步操作,这可能对用户的多设备搬砖需求更友好。 然后,我需要调整技术栈,替换之前的PySimpleGUI和OpenCV部分,改用PyQt5和Airtest。同时,保持原有的配置文件结构和任务管理逻辑,因为用户仍然需要可扩展的任务配置和UI管理功能。 需要注意PyQt5的线程管理,因为在GUI应用中,长时间运行的任务需要用多线程或QThread来避免界面冻结。此外,Airtest的接口可能需要适配多设备同时操作,确保每个设备独立执行任务,且能够响应暂停和中止信号。 另外,用户提到的下拉菜单购买次数,需要设计对应的UI控件,比如QComboBox,在配置文件中保存相关参数。同时,任务执行过程中需要根据用户选择的下拉次数进行操作,这部分逻辑可能需要调整。 还要考虑用户未来添加新任务的便捷性,确保配置文件的结构清晰,UI能动态加载新任务。可能需要使用PyQt5的信号与槽机制来动态更新界面元素。 最后,需要验证Airtest在多线程环境下的稳定性,确保同时操作多个设备时不会出现冲突或资源竞争的问题。同时,测试暂停和中止功能的响应速度,保证用户体验。</think>根据您的新需求,我将提供基于PyQt5 + Airtest的改进方案。以下是完整的技术实现指南: --- ### 一、技术栈升级方案 ```python # 主要依赖库 from PyQt5.QtWidgets import QMainWindow, QCheckBox, QComboBox # PyQt5界面 from airtest.core.api import connect_device, snapshot # Airtest核心 from airtest.aircv import * # 识别 from multi_device import DeviceGroup # 多设备控制 import json import threading ``` --- ### 二、架构改进要点 1. **UI框架重构**: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.device_combo = QComboBox() # 设备选择下拉框 self.task_layout = QVBoxLayout() # 动态任务列表 self.init_ui() def init_ui(self): # 创建可滚动任务区域 scroll = QScrollArea() self.setCentralWidget(scroll) ``` 2. **Airtest深度集成**: ```python class AirtestOperator: def __init__(self, device): self.device = connect_device(f"Android:///{device}") # 连接设备 def smart_click(self, image_path): try: pos = self.device.template(image_path) self.device.click(pos) return True except TargetNotFoundError: return False ``` --- ### 三、核心功能实现 #### 1. 动态UI生成(根据JSON配置) ```python def load_tasks(self): with open(&#39;tasks.json&#39;) as f: tasks = json.load(f) for task in tasks["日常任务"]: # 创建任务复选框 cb = QCheckBox(task["name"], self) self.task_layout.addWidget(cb) # 添加购买次数下拉菜单 if task.get("purchasable"): combo = QComboBox() combo.addItems(["1次", "2次", "3次", "4次"]) combo.setProperty("task_name", task["name"]) # 设置关联属性 self.task_layout.addWidget(combo) ``` #### 2. 多设备同步控制 ```python class DeviceController: def __init__(self): self.device_group = DeviceGroup() def sync_execute(self, task_func): """使用Airtest的行执行功能""" self.device_group.run(task_func) def pause_all(self): self.device_group.stop() def resume_all(self): self.device_group.resume() ``` #### 3. 带购买次数的任务执行 ```python def execute_with_purchase(self, task_config): # 基础任务执行 if self.operator.smart_click(task_config["image"]): # 处理购买次数 for _ in range(task_config["buy_times"]): self.operator.device.click(task_config["purchase_pos"]) time.sleep(1) # 等待购买动画 ``` --- ### 四、完整UI交互逻辑 ```python class ControlLogic(QObject): start_signal = pyqtSignal() pause_signal = pyqtSignal() stop_signal = pyqtSignal() def __init__(self): super().__init__() self.running = False self.paused = False def on_start(self): if not self.running: self.start_signal.emit() self.running = True def on_pause(self): self.paused = not self.paused if self.paused: self.pause_signal.emit() else: self.resume_signal.emit() ``` --- ### 五、Airtest专用优化技巧 1. **识别增强配置**: ```python # 在airtest.cfg中设置 [Template] threshold = 0.7 # 降低匹配阈值提高识别率 rgb = True # 启用颜色匹配 ``` 2. **多设备分辨率适配方案**: ```python def auto_scale(self, pos): """根据设备分辨率自动缩放坐标""" screen_size = self.device.get_current_resolution() return (pos[0]*screen_size[0]/1080, pos[1]*screen_size[1]/1920) ``` --- ### 六、部署建议 1. **环境搭建步骤**: ```bash # 安装专用依赖 pip install pyqt5 airtest pocoui ``` 2. **设备连接验证**: ```python # 在Python控制台测试设备连接 from airtest.core.api import * auto_setup() print(device().list_app()) # 应显示模拟器内应用列表 ``` 3. **像模板规范**: - 使用Airtest IDE截取控件(推荐分辨率 720x1280) - 保存为PNG格式到`/images`目录 - 命名规则:taskname_controltype.png(例:daily_buy_button.png) --- ### 七、方案优势对比 | 功能 | 原方案(OpenCV+PySimpleGUI) | 新方案(Airtest+PyQt5) | |--------------------|---------------------------|-----------------------| | 开发效率 | 需手动实现点击逻辑 | 内置自动化操作API | | 多设备管理 | 需自行维护设备列表 | 原生支持DeviceGroup | | 识别稳定性 | 依赖阈值调整 | 自适应分辨率匹配 | | 界面扩展性 | 简单布局 | 支持复杂控件嵌套 | | 游戏兼容性 | 通用方案 | 专为手游优化 | --- ### 八、扩展建议 1. **增加调试模块**: ```python # 在界面中添加实时日志显示 self.log_view = QTextEdit() self.log_view.setReadOnly(True) layout.addWidget(self.log_view) # 重定向标准输出 sys.stdout = self # 需实现write方法 ``` 2. **添加异常恢复机制**: ```python def safe_retry(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except TargetNotFoundError: args[0].device.home() # 退回主页重试 return func(*args, **kwargs) return wrapper ``` 本方案充分利用了Airtest的游戏自动化特性和PyQt5的界面扩展能力,完整代码量约1200行,建议使用Qt Designer进行界面布局。实际部署时需要特别注意不同模拟器的ADB端口配置,推荐使用雷电模拟器(默认端口5555)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流氓也是种气质 _Cookie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值