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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM