1. 程式人生 > 其它 >opencv入門系列教學(四)處理滑鼠事件

opencv入門系列教學(四)處理滑鼠事件

一、滑鼠事件的簡單演示

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)