#python #opencv #window #mouse #pyautogui
#python #opencv #окно #мышь #pyautogui
Вопрос:
Я знаю, как захватить движение мыши для всего экрана, но я хочу захватить движение мыши в определенном окне в python. Мне нужно отслеживать местоположение мыши в этом конкретном окне.
Ответ №1:
-
- Вам нужно создать окно.
-
cv2.namedWindow(winname='my_drawing', flags=cv2.WINDOW_NORMAL)
-
Необязательно: если вы хотите, вы можете изменить размер окна:
-
cv2.resizeWindow(winname='my_drawing', width=600, height=600)
-
-
- Вам нужна
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)
-
- Вам нужна
-
- Поскольку я планирую нарисовать прямоугольник на изображении. Я должен объявлять изображение 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))
- Поскольку я планирую нарисовать прямоугольник на изображении. Я должен объявлять изображение RGB с тем же размером,
Поэтому, когда я нажимаю один раз на экран и 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()