opencv入門系列教學(四)處理滑鼠事件
阿新 • • 發佈:2021-08-29
一、滑鼠事件的簡單演示
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)