一、滑鼠事件的簡單演示

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)