You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升Python屏幕RGB识别点击脚本的运行速度?

脚本优化建议与解决方案

一、提升目标识别效率与抗干扰能力

  1. 替换高效截图库
    pyautogui.screenshot性能偏慢,改用mss库直接读取显存数据,速度可提升数倍:
from mss import mss
import numpy as np

# 初始化截图对象
sct = mss()
# 定义目标区域(left, top, width, height)
monitor = {"left": 265, "top": 220, "width": 200, "height": 200}

# 替换原有截图逻辑
pic = sct.grab(monitor)
img = np.array(pic)  # 转成numpy数组方便批量处理
  1. 批量像素匹配(替代嵌套循环)
    用numpy向量运算替代Python嵌套循环,处理速度提升几十倍,同时支持多通道颜色匹配,减少背景干扰:
import cv2

# 定义目标RGB的精准范围(示例:需根据实际目标调整R、B通道区间)
lower = np.array([100, 90, 100])
upper = np.array([150, 95, 150])
# 筛选符合条件的像素
mask = cv2.inRange(img, lower, upper)
# 获取所有匹配像素的坐标
y_coords, x_coords = np.where(mask > 0)

if len(x_coords) > 0:
    # 取匹配区域的中心坐标,避免误点孤立像素
    target_x = int(np.mean(x_coords)) + 265
    target_y = int(np.mean(y_coords)) + 220
    click(target_x, target_y)
  1. 过滤背景噪点
    如果目标是连续色块,可通过连通区域分析过滤孤立的背景像素:
# 基于上面的mask变量,查找连通区域
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    # 过滤面积过小的噪点(阈值根据目标大小调整)
    if cv2.contourArea(cnt) > 20:
        # 获取色块中心坐标
        x, y, w, h = cv2.boundingRect(cnt)
        center_x = x + w//2 + 265
        center_y = y + h//2 + 220
        click(center_x, center_y)
        break

二、加快点击与响应速度

  1. 优化点击函数
    替换win32api.mouse_event为更高效的SendInput,减少模拟点击的延迟:
import ctypes
from ctypes import wintypes

user32 = ctypes.WinDLL('user32', use_last_error=True)

INPUT_MOUSE = 0
MOUSEEVENTF_LEFTDOWN = 0x0002
MOUSEEVENTF_LEFTUP = 0x0004

class MOUSEINPUT(ctypes.Structure):
    _fields_ = (("dx", wintypes.LONG),
                ("dy", wintypes.LONG),
                ("mouseData", wintypes.DWORD),
                ("dwFlags", wintypes.DWORD),
                ("time", wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))

class INPUT(ctypes.Structure):
    _fields_ = (("type", wintypes.DWORD),
                ("mi", MOUSEINPUT))

def click(x, y):
    user32.SetCursorPos(x, y)
    # 模拟鼠标按下
    input_down = INPUT(type=INPUT_MOUSE, mi=MOUSEINPUT(dx=0, dy=0, dwFlags=MOUSEEVENTF_LEFTDOWN))
    user32.SendInput(1, ctypes.byref(input_down), ctypes.sizeof(INPUT))
    # 模拟鼠标松开
    input_up = INPUT(type=INPUT_MOUSE, mi=MOUSEINPUT(dx=0, dy=0, dwFlags=MOUSEEVENTF_LEFTUP))
    user32.SendInput(1, ctypes.byref(input_up), ctypes.sizeof(INPUT))

若已知目标窗口句柄,还可直接向窗口发送WM_LBUTTONDOWN/WM_LBUTTONUP消息,无需移动鼠标,响应速度更快。

  1. 移除无效延迟
    删除代码中的time.sleep(1),这是导致无法追踪移动目标的核心障碍。如需避免重复点击,可设置极短延迟(如time.sleep(0.05)),或记录上次点击时间,间隔小于阈值则跳过。

  2. 优化循环逻辑
    找到目标后直接跳出所有循环,进入下一次截图,避免无效遍历:

while True:
    # 截图与识别逻辑...
    if len(x_coords) > 0:
        click(target_x, target_y)
        continue  # 直接进入下一轮截图,不再遍历剩余像素
    # 控制帧率,避免CPU占用过高
    time.sleep(0.01)

三、其他优化细节

  • 锁定目标窗口:提前获取目标窗口句柄,仅对该窗口截图,避免屏幕其他区域干扰,同时提升截图效率。
  • 降低截图分辨率:若目标尺寸足够,可缩小截图区域的分辨率(如将200x200改为100x100),减少数据处理量。
  • 多线程分离:将截图识别与点击操作分离到不同线程,避免识别耗时拖慢点击响应(需注意线程安全)。

内容的提问来源于stack exchange,提问作者eva-2021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:13:12