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博客