天天看點

【Python+OpenCV入門學習】六、滑鼠操作

本篇文章,将學習如何進行滑鼠操作。主要學習函數setMouseCallback()使用。

環境:Windows 7(64)   python 3.6    opencv 3.4.2

一、了解函數setMouseCallback()

滑鼠作為互動式操作,使用起來友好,符合很多人的操作習慣。是以本次學習滑鼠的操作。函數形式如下:

void cv::setMouseCallback( const String & winname,MouseCallback onMouse,void * 	userdata = 0 )	
           

功能:為指定的視窗設定滑鼠處理程式。

參數:

winname:視窗的名字,指定為哪個視窗設定滑鼠處理程式。

onMouse:滑鼠回調函數,當滑鼠事件發生時,調用該函數。如滑鼠左鍵按下時,做什麼事情,該回調函數自己根據需要編寫。

userdata:傳遞給回調的可選參數。預設為0。

建立滑鼠回調函數具有特定的格式,在任何地方都是相同的,它僅在功能方面有所不同。顯然,我們知道滑鼠操作很多,如左右鍵單擊或輕按兩下等,有多個事件,OpenCV提供了如下的事件類型,紅色部分是常用的幾個:

cv.EVENT_MOUSEMOVE:表示滑鼠指針已在視窗上移動。

cv.EVENT_LBUTTONDOWN:表示按下了滑鼠左鍵。

cv.EVENT_RBUTTONDOWN:表示按下了滑鼠右鍵。

cv.EVENT_MBUTTONDOWN:表示按下滑鼠中鍵。

cv.EVENT_LBUTTONUP:表示已釋放滑鼠左鍵。

cv.EVENT_RBUTTONUP:表示已釋放滑鼠右鍵。

cv.EVENT_MBUTTONUP:表示中滑鼠按鈕被釋放。

 cv.EVENT_LBUTTONDBLCLK:表示輕按兩下滑鼠左鍵。

cv.EVENT_RBUTTONDBLCLK:表示輕按兩下滑鼠右鍵。

cv.EVENT_MBUTTONDBLCLK:表示輕按兩下滑鼠中鍵。

cv.EVENT_MOUSEWHEEL:正值和負值分别表示向前和向後滾動。

 cv.EVENT_MOUSEHWHEEL:正值和負值分别表示向右和向左滾動。

二、程式設計實作

滑鼠操作中,主要的是回調函數的編寫,即當某個滑鼠事件發生時做什麼事。我們程式設計實作滑鼠單擊左鍵時畫個固定大小的白色實心圓。代碼如下:

import numpy as np
import cv2 as cv
#先編寫好回調函數
def draw_circle(event,x,y,flags,param):
    if event == cv.EVENT_LBUTTONDOWN:
        cv.circle(img,(x,y),50,(255,255,255),-1)
#建立一幅全黑圖像        
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
#按Esc退出循環
while(1):
    cv.imshow('image',img)
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()
           

程式運作後,點選單擊左鍵,會出現白色實心圓,按Esc可以退出程式,結果圖如下:

【Python+OpenCV入門學習】六、滑鼠操作

在寫一個例程,滑鼠繪制矩形,代碼如下:

import numpy as np
import cv2 as cv
drawing = False 
ix,iy = -1,-1#滑鼠初始化位置
#編寫回調函數,滑鼠畫矩形
def mouse_draw(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_LBUTTONUP:
        drawing = False
        cv.rectangle(img,(ix,iy),(x,y),(255,0,0),1)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',mouse_draw)
while(1):
    cv.imshow('image',img)
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()
           

代碼運作結果如下圖所示:   

【Python+OpenCV入門學習】六、滑鼠操作