簡單例子
我們創(chuàng)建一個簡單的應(yīng)用來绑谣,我們在圖片上雙擊今瀑,就會在那畫一個圓
首先我們創(chuàng)建一個鼠標回調(diào)函數(shù)程梦,當一個鼠標事件發(fā)生時來執(zhí)行点把。鼠標事件可以是任何和鼠標左鍵點下,左鍵抬起屿附,左鍵雙擊等相關(guān)的時間郎逃。它會給我們每次鼠標事件的坐標(x,y)。通過這些事件和坐標挺份,我們可以做任何我們想做得褒翰,要列出所有可用的事件,執(zhí)行下面的代碼:
>>>import cv2
>>>events = [i for i in dir(cv2) if 'EVENT' in i]
>>>print events
創(chuàng)建一個鼠標回調(diào)函數(shù)有通用的格式匀泊。區(qū)別只是這個函數(shù)是做什么的优训。所以我們的鼠標回調(diào)函數(shù)只做一件事,雙擊的時候畫一個圓各聘。
import cv2
import numpy as np
# mouse callback function
def draw_circle(event, x, y, flags, param):
? ? if event == cv2.EVENT_LBUTTONDBLCLK:
? ? ? ? cv2.circle(img, (x, y), 100, (255, 0, 0), -1)
# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
? ? cv2.imshow('image',img)
? ? if cv2.waitKey(20) & 0xFF == 27:
? ? ? ? break
cv2.destroyAllWindows()
更多高級列子
現(xiàn)在我們來看更多更好的例子揣非。在這里,我們通過拖拽鼠標畫矩形或者圓(由我們選擇的模式?jīng)Q定)躲因。所以我們的鼠標回調(diào)函數(shù)有兩個部分早敬,一個是畫矩形,另一個是畫圓大脉。這個例子在創(chuàng)建和理解交互應(yīng)用上很有用搞监,比如對象跟蹤,圖片分割等镰矿。
import cv2
import numpy as np
drawing = False ? ? # true if mouse is pressed
mode=True ? ?# if True, draw rectangle. Press 'm' to toggle to curve
ix, iy = -1, -1
# mouse callback function
def draw_circle(event, x, y, flags, param):
? ? global ix, iy, drawing, mode
? ? if event == cv2.EVENT_LBUTTONDOWN:
? ? ? ? drawing = True
? ? ? ? ix,iy = x,y
? ? elif event == cv2.EVENT_MOUSEMOVE:
? ? ? ? if drawing == True:
? ? ? ? ? ? if mode == True:
? ? ? ? ? ? ? ? cv2.rectangle(img, (ix, iy), (x, y),(0,255,0),-1)
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? cv2.circle(img,(x,y),5,(0,0,255),-1)
? ? elif event == cv2.EVENT_LBUTTONUP:
? ? ? ? drawing = False
? ? ? ? if mode == True:
? ? ? ? ? ? cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
? ? ? ? else:
? ? ? ? ? ? cv2.circle(img,(x,y),5,(0,0,255),-1)
然后我們把這個回調(diào)函數(shù)綁定到OpenCV的窗口腺逛。在主循環(huán)里,我們應(yīng)該設(shè)置一個鍵'm'來切換方和圓衡怀。
img = np.zeros((512, 512, 3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
? ? cv2.imshow('image',img)
? ? k = cv2.waitKey(1) & 0xFF
? ? if k == ord('m'):
? ? ? ? mode = not mode
? ? elif k == 27:
? ? ? ? break
cv2.destroyAllWindows()