<button id="ssm6u"><optgroup id="ssm6u"></optgroup></button>
  • 跳轉至

    鼠標事件監聽

    概要

    本文講解了如何使用HighGUI進行鼠標事件監聽,介紹了都有哪些鼠標事件及其用法。

    keywords Mouse 鼠標 HighGUI 鼠標事件監聽

    20180126mouse.png

    鼠標事件分類

    大家想一想鼠標都可以有哪些事件?

    其實我們可以用腳本的方式,查看cv2 所有以EVENT開頭的預定義變量的名稱列表

    '''
    查看cv2都支持哪些事件
    '''
    
    import cv2
    
    events=[i for i in dir(cv2) if 'EVENT'in i]
    
    for event in events:
        print(event)
    

    快去試一試吧。

    鼠標事件列表(event list)

    • EVENT_MOUSEMOVE 鼠標移動 Mouse Move

    • EVENT_LBUTTONDOWN 鼠標左鍵點擊 Left Button Down

    • EVENT_RBUTTONDOWN 鼠標右鍵點擊 Right Button Down

    • EVENT_MBUTTONDOWN 鼠標中鍵點擊 Middle Button Down

    • EVENT_LBUTTONUP 鼠標左鍵抬起 Left Button Up

    • EVENT_RBUTTONUP 鼠標右鍵抬起 Right Button Up

    • EVENT_MBUTTONUP 鼠標中鍵抬起 Middle Button Up

    • EVENT_LBUTTONDBLCLK 鼠標左鍵雙擊 Left Button Double Click

    • EVENT_RBUTTONDBLCLK 鼠標右鍵雙擊 Right Button Double Click

    • EVENT_MBUTTONDBLCLK 鼠標中鍵雙擊 Middle Button Double Click

    鼠標事件的回調參數

    鼠標事件舉例:

    def onMouse(event,x,y,flags,param): 
        # 判斷事件是否為 Left Button Double Clicck 
        if event == cv2.EVENT_LBUTTONDBLCLK:  
            # 判斷事件類型 執行相關操作
            do_something()
    
    • event 鼠標事件類型, 如上文所述EVENT_MOUSEMOVE等。

    • x 鼠標當前在窗口Windows下的x坐標

    • y 鼠標在當前窗口Windows下的y坐標

    • flags 鼠標事件發生過程值中的一些其他事件標志/狀態

    • EVENT_FLAG_LBUTTON 左鍵正在按下

    • EVENT_FLAG_RBUTTON 右鍵正在被按下

    • EVENT_FLAG_MBUTTON 中鍵正在被按下

    • EVENT_FLAG_CTRLKEY CTRL鍵正在被按下

    • EVENT_FLAG_SHIFTKEY SHIFT鍵正在被按下

    • EVENT_FLAG_ALTKEY ALT鍵正在被按下

    • param 用戶自定義的參數

    簡單一些的例子, 例如, 我們判斷鼠標左鍵是否被按下, 如果按下的話就繪制一個圓圈。

    def draw_circle(event,x,y,flags,param): 
        # 判斷事件是否為 Left Button Double Clicck 
        if event == cv2.EVENT_LBUTTONDBLCLK:  
            cv2.circle(img,(x,y),20,(255,0,0),-1)  
    

    更復雜一些的判斷方法, 是結合flags

    我們起始可以在很多函數的參數看到flags 這類語句。 使用方法跟我們在CH2.2里講解的namedWindow 函數類似。

    例如我們想判斷, 當前左鍵跟ALT鍵是不是處于同時被按下的狀態, 我們可以這么寫:

    def onMouse(event,x,y,flags,param): 
        if flags == ( cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_ALTKEY):  
            # 判斷事件類型 執行相關操作
            do_something()
    

    你也可以使用+運算, 兩者的效果是相同的, 詳情,還是要看我在HighGUI窗口 章節里的介紹啊。二進制位表示狀態。

    def onMouse(event,x,y,flags,param): 
        if flags == ( cv2.EVENT_FLAG_LBUTTON + cv2.EVENT_FLAG_ALTKEY):  
            # 判斷事件類型 執行相關操作
            do_something()
    

    我們也可以結合兩者。做一個復雜的狀態檢測。 CTRL + 鼠標左鍵, 移動鼠標,繪制一個系列圓圈。

    # CTRL + 鼠標左鍵, 移動鼠標,繪制一個系列圓圈
    def onMouse(event,x,y,flags,param): 
        # 判斷事件是否為 Left Button Double Clicck 
        print(flags)
        print(cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_CTRLKEY)
        if event == cv2.EVENT_MOUSEMOVE and flags == (cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_CTRLKEY ):  
            cv2.circle(img,(x,y),20,(255,0,0),-1)
    

    文章推薦

    項目實戰-繪圖板


    韩国精品无码一区二区三区,精品无码一区二区三区AV,欧洲丰满美熟女乱又伦AV,亚洲午夜久久久影院伊人