opencv-python-學習筆記三(鼠標事件)


鼠標事件

打印所有鼠標事件

import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print( events )
#['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP',
'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

將窗口與鼠標事件綁定

cv2.setMouseCallback(windowName, MouseCallback, param=None) 

windowName:窗口名稱

MouseCallback:鼠標響應回調函數

param:響應函數傳遞的的參數

鼠標響應回調函數

MouseCallback (int event, int x, int y, int flags, void *userdata)

event:一個MouseEventTypes 常量

x:鼠標的x坐標

y:鼠標的y坐標

flags:一個MouseEventFlags常量

userdata:可選參數

MouseEventFlags :
  cv.EVENT_FLAG_LBUTTON = 1, 左鍵拖拽
  cv.EVENT_FLAG_RBUTTON = 2, 右鍵拖拽
  cv.EVENT_FLAG_MBUTTON = 4, 中鍵不放
  cv.EVENT_FLAG_CTRLKEY = 8,按住ctrl不放 
  cv.EVENT_FLAG_SHIFTKEY = 16, 按住shift不放
  cv.EVENT_FLAG_ALTKEY = 32 ,按住alt不放

 cv.MouseEventTypes :
  cv.EVENT_MOUSEMOVE = 0, 鼠標移動
  cv.EVENT_LBUTTONDOWN = 1, 左鍵按下
  cv.EVENT_RBUTTONDOWN = 2, 右鍵按下
  cv.EVENT_MBUTTONDOWN = 3, 中鍵按下
  cv.EVENT_LBUTTONUP = 4, 左鍵釋放
  cv.EVENT_RBUTTONUP = 5, 右鍵釋放
  cv.EVENT_MBUTTONUP = 6, 中鍵釋放
  cv.EVENT_LBUTTONDBLCLK = 7, 左鍵雙擊
  cv.EVENT_RBUTTONDBLCLK = 8, 右鍵雙擊
  cv.EVENT_MBUTTONDBLCLK = 9, 中健雙擊
  cv.EVENT_MOUSEWHEEL = 10, 滾輪滑動
  cv.EVENT_MOUSEHWHEEL = 11 橫向滾輪滑動

綜合示例

import numpy as np
import cv2 as cv
drawing = False  # true if mouse is pressed
ix, iy = -1, -1


def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing is True:
            cv.circle(img, (ix, iy), abs(y-iy), (0, 0, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        cv.circle(img, (ix, iy), abs(y-iy), (0, 0, 255), -1)


img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
while(1):
    cv.imshow('image', img)
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM