python 模板匹配图片识别点击

发布于:2024-06-27 ⋅ 阅读:(163) ⋅ 点赞:(0)

import cv2
import pyautogui
import numpy as np
import time

def find_and_click(target_image_path, threshold=0.8, retry_count=3, retry_interval=1):
    """
    在屏幕上查找目标图片并点击,支持重试。

    Args:
        target_image_path (str): 目标图片路径。
        threshold (float, optional): 匹配阈值,默认值为 0.8。
        retry_count (int, optional): 重试次数,默认值为 3。
        retry_interval (int, optional): 重试间隔时间(秒),默认值为 1。
    """

    # 加载目标图片
    target_image = cv2.imread(target_image_path)
    target_gray = cv2.cvtColor(target_image, cv2.COLOR_BGR2GRAY)

    for _ in range(retry_count):
        # 获取屏幕截图
        screen = pyautogui.screenshot()
        screen_np = np.array(screen)
        screen_gray = cv2.cvtColor(screen_np, cv2.COLOR_BGR2GRAY)

        # 使用模板匹配查找目标图片
        result = cv2.matchTemplate(screen_gray, target_gray, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

        # 如果匹配度超过阈值,则模拟鼠标点击
        if max_val > threshold:
            # 获取目标图片中心坐标
            x = max_loc[0] + target_image.shape[1] // 2
            y = max_loc[1] + target_image.shape[0] // 2

            # 模拟鼠标点击
            pyautogui.click(x, y)
            print(f"点击了目标图片在屏幕上的位置 ({x}, {y})")
            return True

        # 识别失败,等待重试间隔时间
        time.sleep(retry_interval)
        print('重试中')

    # 重试次数用完,识别失败
    print(f"在 {retry_count} 次尝试后,未能找到目标图片。")
    return False

# 使用示例
target_image_path = "4.png"
find_and_click(target_image_path, threshold=0.9, retry_count=5, retry_interval=2)

优化

import cv2
import pyautogui
import numpy as np
import time

def find_and_click(target_image_path, match_threshold=0.8, max_retry_count=3, retry_interval=1):
    """
    在屏幕上查找目标图片并点击,支持重试,并展示重试次数。

    Args:
        target_image_path (str): 目标图片路径。
        match_threshold (float, optional): 匹配阈值,默认值为 0.8。
        max_retry_count (int, optional): 重试次数,默认值为 3。
        retry_interval (int, optional): 重试间隔时间(秒),默认值为 1。
    """

    # 加载目标图片并转换为灰度
    target_image = cv2.imread(target_image_path)
    target_gray = cv2.cvtColor(target_image, cv2.COLOR_BGR2GRAY)

    # 缓存目标图片大小
    target_width, target_height = target_image.shape[1], target_image.shape[0]

    for retry_count in range(max_retry_count):
        print(f"尝试次数: {retry_count + 1}/{max_retry_count}")  # 显示尝试次数

        # 获取屏幕截图并转换为灰度
        screen = pyautogui.screenshot()
        screen_gray = cv2.cvtColor(np.array(screen), cv2.COLOR_BGR2GRAY)

        # 使用模板匹配查找目标图片
        result = cv2.matchTemplate(screen_gray, target_gray, cv2.TM_CCOEFF_NORMED)
        _, max_val, _, max_loc = cv2.minMaxLoc(result)

        # 如果匹配度超过阈值,则模拟鼠标点击
        if max_val > match_threshold:
            # 获取目标图片中心坐标
            x = max_loc[0] + target_width // 2
            y = max_loc[1] + target_height // 2

            # 模拟鼠标点击
            pyautogui.click(x, y)
            print(f"点击了目标图片在屏幕上的位置 ({x}, {y})")
            return True

        # 识别失败,等待重试间隔时间
        time.sleep(retry_interval)

    # 重试次数用完,识别失败
    print(f"在 {max_retry_count} 次尝试后,未能找到目标图片。")
    return False

# 使用示例
target_image_path = "4.png"
find_and_click(target_image_path, match_threshold=0.9, max_retry_count=5, retry_interval=2)
  1. 导入库: 首先导入必要的库:

    • cv2: OpenCV 库,用于图像处理。
    • pyautogui: 用于模拟鼠标和键盘操作。
    • numpy: 用于数组操作。
    • time: 用于控制时间。
  2. 定义函数: 定义一个名为 find_and_click 的函数,用于查找目标图片并点击。

  3. 函数参数: 函数接受以下参数:

    • target_image_path: 目标图片的路径。
    • match_threshold: 匹配阈值,表示匹配度需要超过多少才能认为匹配成功。
    • max_retry_count: 最大重试次数。
    • retry_interval: 每次重试之间的间隔时间。
  4. 加载目标图片:

    • target_image = cv2.imread(target_image_path): 加载目标图片。
    • target_gray = cv2.cvtColor(target_image, cv2.COLOR_BGR2GRAY): 将目标图片转换为灰度图像,因为灰度图像处理速度更快。
  5. 缓存目标图片大小:

    • target_width, target_height = target_image.shape[1], target_image.shape[0]: 获取目标图片的宽度和高度,用于计算点击坐标。
  6. 循环重试: 使用 for 循环进行重试,循环次数由 max_retry_count 控制。

    • print(f"尝试次数: {retry_count + 1}/{max_retry_count}"): 打印当前尝试次数。
  7. 获取屏幕截图:

    • screen = pyautogui.screenshot(): 获取屏幕截图。
    • screen_gray = cv2.cvtColor(np.array(screen), cv2.COLOR_BGR2GRAY): 将屏幕截图转换为灰度图像。
  8. 模板匹配:

    • result = cv2.matchTemplate(screen_gray, target_gray, cv2.TM_CCOEFF_NORMED): 使用 cv2.matchTemplate 函数进行模板匹配,寻找目标图片在屏幕截图中的位置。
    • _, max_val, _, max_loc = cv2.minMaxLoc(result): 获取匹配结果,包括最大匹配值 max_val 和匹配位置 max_loc
  9. 判断匹配结果:

    • if max_val > match_threshold:: 如果最大匹配值超过阈值,则认为匹配成功。
  10. 计算点击坐标:

  • x = max_loc[0] + target_width // 2: 计算目标图片中心点的 x 坐标。
  • y = max_loc[1] + target_height // 2: 计算目标图片中心点的 y 坐标。
  1. 模拟鼠标点击:
  • pyautogui.click(x, y): 模拟鼠标点击目标图片中心点。
  • print(f"点击了目标图片在屏幕上的位置 ({x}, {y})"): 打印点击坐标。
  • return True: 返回 True 表示匹配成功。
  1. 重试间隔:
  • time.sleep(retry_interval): 等待 retry_interval 秒,然后进行下一次尝试。
  1. 重试次数用完:
  • print(f"在 {max_retry_count} 次尝试后,未能找到目标图片。"): 如果重试次数用完,仍然没有找到目标图片,则打印提示信息。
  • return False: 返回 False 表示匹配失败。
  1. 使用示例:
  • target_image_path = "4.png": 设置目标图片路径。
  • find_and_click(target_image_path, match_threshold=0.9, max_retry_count=5, retry_interval=2): 调用 find_and_click 函数,并设置参数。

总结:

这段代码使用模板匹配来查找目标图片,并模拟鼠标点击目标图片。它支持重试,并展示了尝试次数。你可以根据自己的需要调整参数,例如匹配阈值、重试次数和重试间隔时间。

python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击-CSDN博客

python 根据图片特征识别点击-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到