鼠標事件
打印所有鼠標事件
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()