一、鼠標事件的簡單演示
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']
具體的鼠標事件類型總結如下:
''' EVENT_FLAG_ALTKEY 摁住Alt EVENT_FLAG_CTRLKEY 摁住Ctrl EVENT_FLAG_LBUTTON 摁住左鍵 EVENT_FLAG_MBUTTON 摁住中鍵 EVENT_FLAG_RBUTTON 摁住右鍵 EVENT_FLAG_SHIFTKEY 摁住Shift EVENT_LBUTTONDBLCLK 左鍵雙擊 EVENT_LBUTTONDOWN 左鍵擊下 EVENT_LBUTTONUP 左鍵彈起 EVENT_MBUTTONDBLCLK 中鍵雙擊 EVENT_MBUTTONDOWN 中鍵擊下 EVENT_MBUTTONUP 中鍵彈起 EVENT_MOUSEHWHEEL 滾動條向左,flags>0。向右,flags<0 EVENT_MOUSEMOVE 鼠標移動 EVENT_MOUSEWHEEL 滾動條向上,flags>0。向下,flags<0 EVENT_RBUTTONDBLCLK 中鍵雙擊 EVENT_RBUTTONDOWN 中鍵擊下 EVENT_RBUTTONUP 中鍵彈起 '''
下面我們來創建一個簡單的應用程序,程序的作用很簡單,無論我們在哪里雙擊它,都可以在圖像上繪制一個圓。
首先,我們創建一個鼠標回調函數,該函數在發生鼠標事件時執行。完整的代碼如下面所示。
import numpy as np import cv2 as cv # 鼠標回調函數 def draw_circle(event,x,y,flags,param): if event == cv.EVENT_LBUTTONDBLCLK: cv.circle(img,(x,y),100,(255,0,0),-1) # 創建一個黑色的圖像,一個窗口,並綁定到窗口的功能 img = np.zeros((512,512,3), np.uint8) cv.namedWindow('image') cv.setMouseCallback('image',draw_circle) while(1): cv.imshow('image',img) if cv.waitKey(20) & 0xFF == 27: break cv.destroyAllWindows()
二、演示實例
下面我們再看一個例子。這個程序里我們希望能夠做到像大多數繪圖軟件那樣,通過拖動鼠標來繪制矩形或圓形(取決於我們選擇的模式) 。所以我們的鼠標回調函數有兩部分,一部分用於繪制矩形,另一部分用於繪制圓形。這個具體的例子對於創建和理解一些交互式應用程序非常有幫助,比如以后的章節里我們介紹到的目標跟蹤,圖像分割等等。
import numpy as np import cv2 as cv drawing = False # 如果按下鼠標,則為真 mode = True # 如果為真,繪制矩形。按 m 鍵可以切換到曲線 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 == True: if mode == True: cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv.circle(img,(x,y),5,(0,0,255),-1) elif event == cv.EVENT_LBUTTONUP: drawing = False if mode == True: cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv.circle(img,(x,y),5,(0,0,255),-1)