python 根据图片特征识别点击

复制代码
import cv2
import numpy as np
import pyautogui
import time

class ImageClicker:
    def __init__(self, target_image_path, retry_count=3, retry_interval=1, match_threshold=0.75):
        self.target_image_path = target_image_path
        self.retry_count = retry_count
        self.retry_interval = retry_interval
        self.match_threshold = match_threshold

        # 加载目标图片
        self.target_image = cv2.imread(self.target_image_path)

        # 提取目标图片的 SIFT 特征
        self.sift = cv2.SIFT_create()
        self.kp1, self.des1 = self.sift.detectAndCompute(self.target_image, None)

    def click_image(self):
        for i in range(self.retry_count):
            try:
                # 获取浏览器窗口截图
                screenshot = pyautogui.screenshot()
                screenshot = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)

                # 提取截图的 SIFT 特征
                kp2, des2 = self.sift.detectAndCompute(screenshot, None)

                # 进行特征匹配
                bf = cv2.BFMatcher()
                matches = bf.knnMatch(self.des1, des2, k=2)

                # 使用 Lowe's Ratio Test 筛选匹配结果
                good = []
                for m, n in matches:
                    if m.distance < self.match_threshold * n.distance:  # 使用 match_threshold 阈值
                        good.append([m])

                # 计算目标元素的位置
                if len(good) > 0:
                    src_pts = np.float32([self.kp1[m[0].queryIdx].pt for m in good]).reshape(-1, 1, 2)
                    dst_pts = np.float32([kp2[m[0].trainIdx].pt for m in good]).reshape(-1, 1, 2)
                    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
                    h, w = self.target_image.shape[:2]
                    pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
                    dst = cv2.perspectiveTransform(pts, M)

                    # 计算点击坐标
                    x = int((dst[0][0][0] + dst[2][0][0]) / 2)  # 计算水平方向的中间位置
                    y = int((dst[0][0][1] + dst[2][0][1]) / 2)  # 计算垂直方向的中间位置

                    # 点击目标元素
                    pyautogui.click(x, y)
                    return True  # 点击成功

            except Exception as e:
                print(f"点击失败:{e}")
                time.sleep(self.retry_interval)

        return False  # 点击失败

# 使用示例
image_clicker = ImageClicker('4.png', retry_count=5,
                             retry_interval=2,
                             match_threshold=0.8)  # 设置 match_threshold 为 0.8
if image_clicker.click_image():
    print("点击成功!")
else:
    print("点击失败!")

代码结构:

  1. 导入库:

    • cv2 (OpenCV):用于图像处理、特征提取和匹配的库。
    • numpy:用于处理图像数据所需的数值运算。
    • pyautogui:用于控制鼠标和键盘,模拟点击操作。
    • time:用于控制代码执行的暂停时间。
  2. ImageClicker 类:

    • __init__(self, target_image_path, retry_count=3, retry_interval=1, match_threshold=0.75)

      • 初始化类,设置一些参数:
        • target_image_path:目标图像的路径。
        • retry_count:如果点击失败,重试的次数。
        • retry_interval:两次重试之间的间隔时间(秒)。
        • match_threshold:匹配阈值,用于判断目标图像与屏幕截图的匹配程度。值越高,匹配要求越严格。
      • 加载目标图像 self.target_image
      • 创建 SIFT (尺度不变特征变换) 对象 self.sift,用于提取图像特征。
      • 计算目标图像的 SIFT 特征 self.kp1, self.des1
    • click_image(self)

      • 循环尝试 retry_count 次:
        • 获取屏幕截图 screenshot
        • 将截图转换为 OpenCV 格式。
        • 提取截图的 SIFT 特征 kp2, des2
        • 使用 cv2.BFMatcher 进行特征匹配,得到匹配结果 matches
        • 使用 Lowe's Ratio Test 筛选匹配结果,得到 good 匹配列表。
        • 如果找到匹配结果:
          • 计算目标元素的位置(点击坐标)。
          • 使用 pyautogui.click() 模拟点击操作。
          • 返回 True,表示点击成功。
        • 如果没有找到匹配结果,则等待 retry_interval 秒后继续尝试。
      • 如果所有尝试都失败,则返回 False,表示点击失败。

使用方法:

  • 创建 ImageClicker 对象,传入目标图像路径和其他参数。
  • 调用 click_image() 方法尝试点击目标图像。

代码示例:

复制代码
image_clicker = ImageClicker('4.png', retry_count=5, retry_interval=2, match_threshold=0.8)
if image_clicker.click_image():
    print("点击成功!")
else:
    print("点击失败!")

代码主要流程:

  1. 加载目标图像并提取其 SIFT 特征。
  2. 获取屏幕截图并提取其 SIFT 特征。
  3. 将目标图像的特征与截图的特征进行匹配。
  4. 使用 Lowe's Ratio Test 筛选匹配结果。
  5. 计算目标元素的位置(点击坐标)。
  6. 模拟点击目标元素。

注意:

  • 为了使代码正常运行,需要安装必要的库:opencv-python, pyautogui
  • 确保目标图像 4.png 存在于代码所在的目录中。
  • 调整 match_threshold 值可以改变匹配的严格程度。
  • 为了避免误点击,可以根据实际情况调整 retry_countretry_interval

python OpenCV 库中的 cv2.Canny() 函数来对图像进行边缘检测,并显示检测到的边缘特征-CSDN博客

相关推荐
神仙别闹31 分钟前
基于Python + SQL server 实现(GUI)原神圣遗物管理与角色数值模拟系统
java·数据库·python
是有头发的程序猿1 小时前
电商自动化实战:淘宝/天猫item_get商品详情API全量采集教程(Python源码)
java·python·自动化
_不会dp不改名_1 小时前
python-opencv环境搭建
开发语言·python·opencv
勇往直前plus1 小时前
智能体记忆概述
人工智能·python·ai
HappyAcmen1 小时前
9.复盘API全套流程
开发语言·python
zh路西法1 小时前
【Linux 串口通信】基于 C++ 多线程的同步/异步串口实现
linux·运维·c++·python
北暮城南1 小时前
使用 Claude Code 高效实现图像边缘检测:多算法对比与工程实践
python·opencv·numpy·matplotlib·边缘检测·claude code
装不满的克莱因瓶1 小时前
学习并掌握 LangChain 检索器的作用,实现让 LLM 动态调用知识库功能
人工智能·python·ai·langchain·llm·agent·智能体
devnullcoffee2 小时前
亚马逊 Buy Box 数据采集完全指南(2026):Python 实战 + Pangolinfo API
开发语言·python·亚马逊数据采集·亚马逊数据 api·pangolinfo api·亚马逊 buy box 数据·亚马逊数据采集软件
imDwAaY2 小时前
贝叶斯网络到粒子滤波Python算法实现 CS188 Proj4 学习笔记
网络·人工智能·笔记·python·学习·算法