使用Pyautogui定位OpenCV检测到的图标

我正在制作一个机器人程序,它能检测屏幕上的图标,并将鼠标移动到用户选择的检测到的图标上。以下是代码的样貌:

import numpy as np
import pyautogui
import cv2
from PIL import ImageGrab
fourcc = cv2.VideoWriter_fourcc(*'XVID')
face_csc = cv2.CascadeClassifier('improved_cascade.xml')
out = cv2.VideoWriter("output.avi", fourcc, 5.0, (1366, 768))
while True:
    img = ImageGrab.grab(bbox=None)
    # 将图像转换为numpy数组
    img_np = np.array(img)
    # 将颜色空间从BGR转换为RGB
    frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
    # 在OpenCV框架上显示图像
    faces = face_csc.detectMultiScale(frame, 1.1 , 15)
    for (x,y,w,h) in faces:
        detected_icon = cv2.rectangle(frame,(x,y),(x+w,y+h), (255,0,0), 2)
        roi_gray = frame[y:y+h, x:x+w]
        roi_color = img_np[y:y+h,x:x+w]
        cv2.putText(frame,'icon',(x,y),cv2.FONT_HERSHEY_TRIPLEX,0.8,(0,0,255),1)
        cv2.imshow("stream", frame)
    # 将帧写入视频写入器
    out.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
out.release()
cv2.destroyAllWindows()

但是我遇到了一个问题,无法让我的鼠标点击OpenCV检测到的图标。例如:假设我设置了程序,当它在屏幕上检测到Chrome时,它会自动将鼠标悬停在图标上并点击它。我该如何实现这个功能呢?谢谢


回答:

我没有装有Windows的机器来运行ImageGrab,但我假设它生成的截图与实际屏幕的宽度和高度(以像素为单位)相同,考虑到Pyautogui和OpenCV都将原点放在左上角,将其转换到Pyautogui应该是直接的:

for (x,y,w,h) in faces:
    center_x = x + 0.5 * w
    center_y = y + 0.5 * h
    pyautogui.click(center_x, center_y)

这将鼠标指针传送到对象矩形的中心并点击它。如果你想模拟更像人类的鼠标移动和点击,Pyautogui有一些工具可以用于这个目的。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注