python 模板匹配图片识别点击

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis-Bitmap位图及其常用命令详解

1.Redis概述 2.Bitmap Bitmap 是 Redis 中的一种数据结构,用于表示位图(bit array)。 它通常用于处理大规模数据集中每个元素的状态,比如用户的在线/离线状态(每个用户对应一个位,表示在线(1&a…

计算机基础(6)——编码与解码-二进制与文本

💗计算机基础系列文章💗 👉🍀计算机基础(1)——计算机的发展史🍀👉🍀计算机基础(2)——冯诺依曼体系结构🍀👉&#x1f34…

Rust 程序设计语言学习——泛型、Trait和生命周期

每一种编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是泛型。泛型是具体类型或其他属性的抽象替代。 Trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 Trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为…

Mac excel 同时冻结首行和首列

1. 选择B2窗格 2. 选择视图 3. 选择冻结窗格 最后首行和首列的分割线加粗了就表示成功了

youlai-boot项目的学习(3) 本地redis、MinIO的安装与配置

youlai-boot项目除了使用mysql数据库、还有redis,以及OSS服务,OSS除了云OSS服务,还有自部署的MinIO服务。 前面我们已经安装好了mysql数据库,那么我们来看看本地redis、MinIO服务怎么部署 环境 mac OS, iterm2&#…

C语言力扣刷题8——环形链表——[快慢双指针, 龟兔赛跑]

力扣刷题8——环形链表——[快慢双指针, 龟兔赛跑] 一、博客声明二、题目描述三、解题思路1、思路说明 四、解题代码(附注释) 一、博客声明 找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来…

分布式事务解决方案(八股)

1. CAP理论 一致性【Consistency】:所有节点访问最新的数据可用性【Availability】:非故障节点响应正常分区容错性【Partition Tolerance】:分布式系统出现网络分区,仍能对外提供服务 附:网络分区:分布式…

拳打开源SOTA脚踢商业闭源的LI-DiT是怎样炼成的?(商汤/MMLab/上海AI Lab)

文章地址:https://arxiv.org/pdf/2406.11831 仅基于解码器的 Transformer 的大语言模型(LLMs)与 CLIP 和 T5 系列模型相比,已经展示出卓越的文本理解能力。然而,在文本到图像扩散模型中利用当前先进的大语言模型的范例…

[机器学习]-3 万字话清从传统神经网络到深度学习

神经网络(Neural Networks, NNs)是机器学习的一种重要方法,灵感来源于生物神经系统,由大量互联的节点(称为神经元或单元)组成,通过调整这些节点间的连接权重来学习和表示复杂的非线性关系。传统…

中霖教育怎么样?注册会计师考试难吗?

中霖教育:注册会计师(CPA)考试的难度高吗? 对于不同背景的考生来说,注册会计师考试的挑战程度不同。那些有良好基础和充裕准备时间的考生,通过考试的可能性要超过那些从零开始且准备时间有限的人。 据最近…

GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录 问题描述GPOPS代码main functioncontinuous functionendpoint function仿真结果 最后 问题描述 参考文献:[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4…

6.28学习笔记

一、马克思 1、对立的历史观:唯物史观、唯心史观(不是“主义”) 2、人口因素对社会发展起(制约和影响)作用 3、自然地理环境是人类社会生存和发展(永恒的、必要的条件) 4、哲学社会科学的发展水…

Linux基础- 使用 Apache 服务部署静态网站

目录 零. 简介 一. linux安装Apache 二. 创建网页 三. window访问 修改了一下默认端口 到 8080 零. 简介 Apache 是世界使用排名第一的 Web 服务器软件。 它具有以下一些显著特点和优势: 开源免费:可以免费使用和修改,拥有庞大的社区支…

Web渗透:任意文件下载

任意文件下载漏洞(Arbitrary File Download Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改输入参数,从服务器下载任意文件,而不仅仅是预期的文件;通常这种漏洞出现在处理用户输入的地方&…

343. 整数拆分(leetcode)

343. 整数拆分(leetcode) 题目描述 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。返回你可以获得的最大乘积 。 示例1 输入: n 2 输出: 1 解释: 2 1 1, 1 1…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

Spring MVC数据绑定和响应——复杂数据绑定(三)复杂POJO绑定

一、复杂POJO数组绑定的使用场景 使用简单POJO类型已经可以完成多数的数据绑定,但有时客户端请求中传递的参数比较复杂。例如,在用户查询订单时,页面传递的参数可能包括订单编号、用户名称等信息,这就包含了订单和用户两个对象的信…

AI进阶指南第四课,大模型优缺点研究?

在上一篇文章中,我主要探讨了LM模型与企业级模型的融合。 但是,在文末对于具体的大模型优缺点只是简单地说明了一下,并不细致。 因此,在这一节,我将更为细致地说明一下大模型的优缺点。 一,隐私安全 将L…

2018年全国大学生数学建模竞赛A题高温服装设计(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分Matlab源代码问题11 求解h1h22 已知h1h2求解温度分布 问题21 求解第二层最佳厚度 四、完整word版论文和源代码(两种获取方式) 一、部分题目 2018 年高教社杯全国大学生数学建模竞赛题目 A 题 高温作业专用服…

vCenter- KMS Server healthy warning

- 问题摘要:KMS Server healthy warning. - 分析/故障排除: 检查集群配置-Security-Key Providers界面,发现KMS Server并没有完整配置并且目前集群内的虚机没有使用加密功能(VM Encryption),您可以忽略该告警提示。 …