Python结合CV2模板匹配,优化PyDirectInput移动随时停止逻辑咨询
优化思路
核心是只在需要移动时按住方向键,满足停止条件后立即松开,彻底避免反复调用keyDown和keyUp的问题。
实现步骤
- 通过模板匹配获取目标坐标与当前角色坐标
- 计算坐标差值判断移动方向,一次性按下对应方向键
- 循环实时截图并计算坐标间距,达到停止阈值后松开按键
- 加入短间隔控制截图频率,降低资源占用
优化后代码示例
import cv2 import pydirectinput import time import pyautogui import numpy as np def get_center_pos(screen_img, template_img): # 模板匹配并返回匹配区域的中心坐标 result = cv2.matchTemplate(screen_img, template_img, cv2.TM_CCOEFF_NORMED) _, _, _, max_loc = cv2.minMaxLoc(result) h, w = template_img.shape[:2] return (max_loc[0] + w//2, max_loc[1] + h//2) def move_to_target(target_pos, role_template, stop_threshold=5): # 计算初始坐标差值,确定移动方向 screen_img = cv2.cvtColor(np.array(pyautogui.screenshot()), cv2.COLOR_RGB2BGR) current_pos = get_center_pos(screen_img, role_template) dx = target_pos[0] - current_pos[0] dy = target_pos[1] - current_pos[1] direction = 'right' if dx > abs(dy) else 'left' if dx < -abs(dy) else \ 'down' if dy > abs(dx) else 'up' # 按住方向键 pydirectinput.keyDown(direction) # 循环检测直到到达目标区域 while True: # 实时截图并更新当前坐标 screen_img = cv2.cvtColor(np.array(pyautogui.screenshot()), cv2.COLOR_RGB2BGR) current_pos = get_center_pos(screen_img, role_template) # 计算当前与目标的曼哈顿距离 distance = abs(target_pos[0] - current_pos[0]) + abs(target_pos[1] - current_pos[1]) if distance <= stop_threshold: pydirectinput.keyUp(direction) break # 控制循环频率,避免资源占用过高 time.sleep(0.05) # 示例调用 # 提前加载角色和目标的模板图片 role_img = cv2.imread('role_template.png') target_img = cv2.imread('target_template.png') # 获取初始目标坐标 init_screen = cv2.cvtColor(np.array(pyautogui.screenshot()), cv2.COLOR_RGB2BGR) target_position = get_center_pos(init_screen, target_img) # 启动移动 move_to_target(target_position, role_img)
关键优化点
- 减少按键交互次数:全程仅调用1次
keyDown和1次keyUp,替代原逻辑中的反复调用 - 简化循环逻辑:循环内仅做截图、坐标计算和阈值判断,执行效率更高
- 降低资源消耗:通过
time.sleep(0.05)控制截图频率,避免CPU过度占用
内容的提问来源于stack exchange,提问作者S D
相关产品推荐
相关产品推荐

