import cv2
import pyautogui
import numpy as np
import timedef 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] // 2y = 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 timedef 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 // 2y = 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函数,并设置参数。
总结:
这段代码使用模板匹配来查找目标图片,并模拟鼠标点击目标图片。它支持重试,并展示了尝试次数。你可以根据自己的需要调整参数,例如匹配阈值、重试次数和重试间隔时间。
python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击-CSDN博客
python 根据图片特征识别点击-CSDN博客