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)
导入库: 首先导入必要的库:
cv2
: OpenCV 库,用于图像处理。pyautogui
: 用于模拟鼠标和键盘操作。numpy
: 用于数组操作。time
: 用于控制时间。
定义函数: 定义一个名为
find_and_click
的函数,用于查找目标图片并点击。函数参数: 函数接受以下参数:
target_image_path
: 目标图片的路径。match_threshold
: 匹配阈值,表示匹配度需要超过多少才能认为匹配成功。max_retry_count
: 最大重试次数。retry_interval
: 每次重试之间的间隔时间。
加载目标图片:
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
循环进行重试,循环次数由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)
: 使用cv2.matchTemplate
函数进行模板匹配,寻找目标图片在屏幕截图中的位置。_, max_val, _, max_loc = cv2.minMaxLoc(result)
: 获取匹配结果,包括最大匹配值max_val
和匹配位置max_loc
。
判断匹配结果:
if max_val > match_threshold:
: 如果最大匹配值超过阈值,则认为匹配成功。
计算点击坐标:
x = max_loc[0] + target_width // 2
: 计算目标图片中心点的 x 坐标。y = max_loc[1] + target_height // 2
: 计算目标图片中心点的 y 坐标。
- 模拟鼠标点击:
pyautogui.click(x, y)
: 模拟鼠标点击目标图片中心点。print(f"点击了目标图片在屏幕上的位置 ({x}, {y})")
: 打印点击坐标。return True
: 返回True
表示匹配成功。
- 重试间隔:
time.sleep(retry_interval)
: 等待retry_interval
秒,然后进行下一次尝试。
- 重试次数用完:
print(f"在 {max_retry_count} 次尝试后,未能找到目标图片。")
: 如果重试次数用完,仍然没有找到目标图片,则打印提示信息。return False
: 返回False
表示匹配失败。
- 使用示例:
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
函数,并设置参数。
总结:
这段代码使用模板匹配来查找目标图片,并模拟鼠标点击目标图片。它支持重试,并展示了尝试次数。你可以根据自己的需要调整参数,例如匹配阈值、重试次数和重试间隔时间。