1、用戶經過鼠標對圖像視窗最多見的操做,
例如:ide
左鍵單擊按下函數
左鍵單擊擡起測試
左鍵按下拖動ui
。。。指針
2、操做響應事件code
setMouseCallback()函數:cv2.setMouseCallback('image',OnMouseAction)
事件
OnMouseAction()響應函數:def OnMouseAction(event,x,y,flags,param):
回調函數
Event: EVENT_MOUSEMOVE 0 //滑動 EVENT_LBUTTONDOWN 1 //左鍵點擊 EVENT_RBUTTONDOWN 2 //右鍵點擊 EVENT_MBUTTONDOWN 3 //中鍵點擊 EVENT_LBUTTONUP 4 //左鍵放開 EVENT_RBUTTONUP 5 //右鍵放開 EVENT_MBUTTONUP 6 //中鍵放開 EVENT_LBUTTONDBLCLK 7 //左鍵雙擊 EVENT_RBUTTONDBLCLK 8 //右鍵雙擊 EVENT_MBUTTONDBLCLK 9 //中鍵雙擊
int x,int y,表明鼠標位於窗口的(x,y)座標位置,即Point(x,y);it
int flags,表明鼠標的拖拽事件,以及鍵盤鼠標聯合事件,共有32種事件:io
flags: EVENT_FLAG_LBUTTON 1 //左鍵拖曳 EVENT_FLAG_RBUTTON 2 //右鍵拖曳 EVENT_FLAG_MBUTTON 4 //中鍵拖曳 EVENT_FLAG_CTRLKEY 8 //(8~15)按Ctrl不放事件 EVENT_FLAG_SHIFTKEY 16 //(16~31)按Shift不放事件 EVENT_FLAG_ALTKEY 32 //(32~39)按Alt不放事件
param
函數指針 標識了所響應的事件函數,至關於自定義了一個OnMouseAction()函數的ID。
3、測試鼠標事件的代碼
Opencv中setMouseCallback()建立了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再擡起的過程,都會分3次調用鼠標響應函數,而且響應順序是:
1.左鍵單擊按下;
2.左鍵單擊擡起;
3.鼠標指針位置移動(即便原地單擊,鼠標位置並無移動);
import cv2 import numpy as np #建立回調函數 def OnMouseAction(event,x,y,flags,param): if event == cv2.EVENT_LBUTTONDOWN: print("左鍵點擊") elif event==cv2.EVENT_RBUTTONDOWN : print("右鍵點擊") elif flags==cv2.EVENT_FLAG_LBUTTON: print("左鍵拖曳") elif event==cv2.EVENT_MBUTTONDOWN : print("中鍵點擊") ''' 建立回調函數的函數setMouseCallback(); 下面把回調函數與OpenCV窗口綁定在一塊兒 ''' img = np.zeros((500,500,3),np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',OnMouseAction) cv2.imshow('image',img) cv2.waitKey(30000) cv2.destroyAllWindows()
4、鼠標事件 練習
作一個簡單可切換畫圖模式的畫板
默認初始是 線段模式,
按下「L」 進入線段模式,
按下「T」 進入矩陣模式。
import cv2 import numpy as np mode = 0 #建立回調函數 def OnMouseAction(event,x,y,flags,param): global x1, y1 if mode == 0 and event == cv2.EVENT_LBUTTONDOWN: print("左鍵點擊") cv2.line(img,(0,0),(x,y),(255,255,0),2) if mode == 1 and event == cv2.EVENT_LBUTTONDOWN: print("左鍵點擊1") x1, y1 = x, y elif mode == 1 and event==cv2.EVENT_MOUSEMOVE and flags ==cv2.EVENT_FLAG_LBUTTON: print("左鍵拖曳1") cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),-1) ''' 下面把回調函數與OpenCV窗口綁定在一塊兒 ''' img = np.zeros((500,500,3),np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',OnMouseAction) while(1): cv2.imshow('image',img) k=cv2.waitKey(1) if k==ord('l'): mode = 0 elif k==ord('t'): mode = 1 elif k==ord('q'): break cv2.destroyAllWindows()