【问题标题】:How to capture the mouse movement within a given window in Python?如何在 Python 中捕获给定窗口内的鼠标移动?
【发布时间】:2021-01-13 03:03:11
【问题描述】:

我知道如何捕获整个屏幕的鼠标移动,但我想在 python 的特定窗口中捕获鼠标移动。我需要在该特定窗口中跟踪鼠标的位置。

【问题讨论】:

    标签: python opencv window mouse pyautogui


    【解决方案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. 因为我打算在图像上绘制一个矩形。我应该声明一个与 my_drawing 命名窗口大小相同的 RGB 图像。
      • img = np.zeros((600, 600, 3), np.uint8)
        
      • 以下部分是可选的,我想在按s关键字时显示坐标。

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

    所以当我在屏幕上单击一次并在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) & 0xFF
        if k == 27:
            break
        elif k == ord('s'):
            print("x, y = ({}, {})".format(x_mouse, y_mouse))
    cv2.destroyAllWindows()
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2011-01-29
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2023-03-19
      相关资源
      最近更新 更多