Как зафиксировать движение мыши в заданном окне в Python?

#python #opencv #window #mouse #pyautogui

#python #opencv #окно #мышь #pyautogui

Вопрос:

Я знаю, как захватить движение мыши для всего экрана, но я хочу захватить движение мыши в определенном окне в python. Мне нужно отслеживать местоположение мыши в этом конкретном окне.

Ответ №1:

    1. Вам нужно создать окно.
    •  cv2.namedWindow(winname='my_drawing', flags=cv2.WINDOW_NORMAL)
        
    • Необязательно: если вы хотите, вы можете изменить размер окна:

      •  cv2.resizeWindow(winname='my_drawing', width=600, height=600)
          
    1. Вам нужна callback функция мыши, которая будет возвращать координаты мыши. Предположим, я хочу нарисовать прямоугольники на экране.
    •  cv2.setMouseCallback('my_drawing', draw_rectangle)
        
    • Мой draw_rectangle будет:

    •  def draw_rectangle(event, x, y, flags, param):
          global x_mouse, y_mouse
          if event == cv2.EVENT_LBUTTONDOWN:
              cv2.rectangle(img, pt1=(x, y), 
                            pt2=(x 10, y 10), 
                            color=(180, 105, 255),
                            thickness=4)
          cv2.imshow('my_drawing', img)
          cv2.waitKey(0)
          x_mouse, y_mouse = x, y
        
    • У нас есть две global переменные, которые мы объявим вне функции как

      •  x_mouse, y_mouse = (None, None)
          
    1. Поскольку я планирую нарисовать прямоугольник на изображении. Я должен объявлять изображение RGB с тем же размером, my_drawing что и имя window .
    •  img = np.zeros((600, 600, 3), np.uint8)
        
    • Приведенная ниже часть необязательна, я хочу отображать координаты при нажатии s ключевого слова.

       while True:
          cv2.imshow('my_drawing', img)
          k = cv2.waitKey(0) amp; 0xFF
          if k == 27:
              break
          elif k == ord('s'):
              print("x, y = ({}, {})".format(x_mouse, y_mouse))
        

Поэтому, когда я нажимаю один раз на экран и 2 раза на s ключевое слово, результат будет:

введите описание изображения здесь

 x, y = (503, 420)
x, y = (363, 362)
x, y = (499, 274)
x, y = (289, 291)
x, y = (304, 439)
  

Код:

 import cv2
import numpy as np

x_mouse, y_mouse = (None, None)


def draw_rectangle(event, x, y, flags, param):
    global x_mouse, y_mouse
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.rectangle(img, pt1=(x, y),
                      pt2=(x 10, y 10),
                      color=(180, 105, 255),
                      thickness=4)
        cv2.imshow('my_drawing', img)
        cv2.waitKey(0)
        x_mouse, y_mouse = x, y


cv2.namedWindow(winname='my_drawing', flags=cv2.WINDOW_NORMAL)
cv2.resizeWindow(winname='my_drawing', width=600, height=600)
cv2.setMouseCallback('my_drawing', draw_rectangle)
img = np.zeros((600, 600, 3), np.uint8)
while True:
    cv2.imshow('my_drawing', img)
    k = cv2.waitKey(10) amp; 0xFF
    if k == 27:
        break
    elif k == ord('s'):
        print("x, y = ({}, {})".format(x_mouse, y_mouse))
cv2.destroyAllWindows()