鼠標事件監聽¶
概要¶
本文講解了如何使用HighGUI進行鼠標事件監聽,介紹了都有哪些鼠標事件及其用法。
keywords Mouse 鼠標 HighGUI 鼠標事件監聽
鼠標事件分類¶
大家想一想鼠標都可以有哪些事件?
其實我們可以用腳本的方式,查看cv2
所有以EVENT
開頭的預定義變量的名稱列表
''' 查看cv2都支持哪些事件 ''' import cv2 events=[i for i in dir(cv2) if 'EVENT'in i] for event in events: print(event)
快去試一試吧。
鼠標事件列表(event list)
-
EVENT_MOUSEMOVE
鼠標移動 Mouse Move -
EVENT_LBUTTONDOWN
鼠標左鍵點擊 Left Button Down -
EVENT_RBUTTONDOWN
鼠標右鍵點擊 Right Button Down -
EVENT_MBUTTONDOWN
鼠標中鍵點擊 Middle Button Down -
EVENT_LBUTTONUP
鼠標左鍵抬起 Left Button Up -
EVENT_RBUTTONUP
鼠標右鍵抬起 Right Button Up -
EVENT_MBUTTONUP
鼠標中鍵抬起 Middle Button Up -
EVENT_LBUTTONDBLCLK
鼠標左鍵雙擊 Left Button Double Click -
EVENT_RBUTTONDBLCLK
鼠標右鍵雙擊 Right Button Double Click -
EVENT_MBUTTONDBLCLK
鼠標中鍵雙擊 Middle Button Double Click
鼠標事件的回調參數¶
鼠標事件舉例:
def onMouse(event,x,y,flags,param): # 判斷事件是否為 Left Button Double Clicck if event == cv2.EVENT_LBUTTONDBLCLK: # 判斷事件類型 執行相關操作 do_something()
-
event
鼠標事件類型, 如上文所述EVENT_MOUSEMOVE
等。 -
x
鼠標當前在窗口Windows下的x坐標 -
y
鼠標在當前窗口Windows下的y坐標 -
flags
鼠標事件發生過程值中的一些其他事件標志/狀態 -
EVENT_FLAG_LBUTTON
左鍵正在按下 -
EVENT_FLAG_RBUTTON
右鍵正在被按下 -
EVENT_FLAG_MBUTTON
中鍵正在被按下 -
EVENT_FLAG_CTRLKEY
CTRL鍵正在被按下 -
EVENT_FLAG_SHIFTKEY
SHIFT鍵正在被按下 -
EVENT_FLAG_ALTKEY
ALT鍵正在被按下 -
param
用戶自定義的參數
簡單一些的例子, 例如, 我們判斷鼠標左鍵是否被按下, 如果按下的話就繪制一個圓圈。
def draw_circle(event,x,y,flags,param): # 判斷事件是否為 Left Button Double Clicck if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),20,(255,0,0),-1)
更復雜一些的判斷方法, 是結合flags
我們起始可以在很多函數的參數看到flags 這類語句。 使用方法跟我們在CH2.2里講解的namedWindow
函數類似。
例如我們想判斷, 當前左鍵跟ALT鍵是不是處于同時被按下的狀態, 我們可以這么寫:
def onMouse(event,x,y,flags,param): if flags == ( cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_ALTKEY): # 判斷事件類型 執行相關操作 do_something()
你也可以使用+
運算, 兩者的效果是相同的, 詳情,還是要看我在HighGUI窗口 章節里的介紹啊。二進制位表示狀態。
def onMouse(event,x,y,flags,param): if flags == ( cv2.EVENT_FLAG_LBUTTON + cv2.EVENT_FLAG_ALTKEY): # 判斷事件類型 執行相關操作 do_something()
我們也可以結合兩者。做一個復雜的狀態檢測。 CTRL + 鼠標左鍵, 移動鼠標,繪制一個系列圓圈。
# CTRL + 鼠標左鍵, 移動鼠標,繪制一個系列圓圈 def onMouse(event,x,y,flags,param): # 判斷事件是否為 Left Button Double Clicck print(flags) print(cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_CTRLKEY) if event == cv2.EVENT_MOUSEMOVE and flags == (cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_CTRLKEY ): cv2.circle(img,(x,y),20,(255,0,0),-1)