【AI基礎】python:openCV——處理鼠標事件(1)

1、用戶經過鼠標對圖像視窗最多見的操做,
例如:ide

  1. 左鍵單擊按下函數

  2. 左鍵單擊擡起測試

  3. 左鍵按下拖動ui

  4. 鼠標指針位置移動

。。。指針

2、操做響應事件code

setMouseCallback()函數:
cv2.setMouseCallback('image',OnMouseAction)事件

OnMouseAction()響應函數:
def OnMouseAction(event,x,y,flags,param):回調函數

Event:  
EVENT_MOUSEMOVE 0             //滑動  
EVENT_LBUTTONDOWN 1           //左鍵點擊  
EVENT_RBUTTONDOWN 2           //右鍵點擊  
EVENT_MBUTTONDOWN 3           //中鍵點擊  
EVENT_LBUTTONUP 4             //左鍵放開  
EVENT_RBUTTONUP 5             //右鍵放開  
EVENT_MBUTTONUP 6             //中鍵放開  
EVENT_LBUTTONDBLCLK 7         //左鍵雙擊  
EVENT_RBUTTONDBLCLK 8         //右鍵雙擊  
EVENT_MBUTTONDBLCLK 9         //中鍵雙擊

int x,int y,表明鼠標位於窗口的(x,y)座標位置,即Point(x,y);it

int flags,表明鼠標的拖拽事件,以及鍵盤鼠標聯合事件,共有32種事件:io

flags:  
EVENT_FLAG_LBUTTON 1       //左鍵拖曳  
EVENT_FLAG_RBUTTON 2       //右鍵拖曳  
EVENT_FLAG_MBUTTON 4       //中鍵拖曳  
EVENT_FLAG_CTRLKEY 8       //(8~15)按Ctrl不放事件  
EVENT_FLAG_SHIFTKEY 16     //(16~31)按Shift不放事件  
EVENT_FLAG_ALTKEY 32       //(32~39)按Alt不放事件

param
函數指針 標識了所響應的事件函數,至關於自定義了一個OnMouseAction()函數的ID。

3、測試鼠標事件的代碼

Opencv中setMouseCallback()建立了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再擡起的過程,都會分3次調用鼠標響應函數,而且響應順序是:

1.左鍵單擊按下;

2.左鍵單擊擡起;

3.鼠標指針位置移動(即便原地單擊,鼠標位置並無移動);

import cv2
import numpy as np

#建立回調函數
def OnMouseAction(event,x,y,flags,param):

    if event == cv2.EVENT_LBUTTONDOWN:
        print("左鍵點擊")
    elif event==cv2.EVENT_RBUTTONDOWN :
        print("右鍵點擊")
    elif flags==cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳")
    elif event==cv2.EVENT_MBUTTONDOWN :
        print("中鍵點擊")

'''
建立回調函數的函數setMouseCallback();
下面把回調函數與OpenCV窗口綁定在一塊兒
'''
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouseAction)     
cv2.imshow('image',img)
cv2.waitKey(30000)
cv2.destroyAllWindows()

4、鼠標事件 練習

作一個簡單可切換畫圖模式的畫板
默認初始是 線段模式,
按下「L」 進入線段模式,
按下「T」 進入矩陣模式。

import cv2
import numpy as np

mode = 0

#建立回調函數
def OnMouseAction(event,x,y,flags,param):
    global x1, y1

    if mode == 0 and event == cv2.EVENT_LBUTTONDOWN:
        print("左鍵點擊")
        cv2.line(img,(0,0),(x,y),(255,255,0),2)

    if mode == 1 and event == cv2.EVENT_LBUTTONDOWN:
        print("左鍵點擊1")
        x1, y1 = x, y
    elif mode == 1 and event==cv2.EVENT_MOUSEMOVE and flags ==cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳1")
        cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),-1)

'''
下面把回調函數與OpenCV窗口綁定在一塊兒
'''
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouseAction)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)
    if k==ord('l'):
        mode = 0
    elif k==ord('t'):
        mode = 1
    elif k==ord('q'):
        break
cv2.destroyAllWindows()
相關文章
相關標籤/搜索