簡單例子
我們創建一個簡單的應用來,我們在圖片上雙擊,就會在那畫一個圓
首先我們創建一個鼠標回調函數,當一個鼠標事件發生時來執行。鼠標事件可以是任何和鼠標左鍵點下,左鍵抬起,左鍵雙擊等相關的時間。它會給我們每次鼠標事件的坐標(x,y)。通過這些事件和坐標,我們可以做任何我們想做得,要列出所有可用的事件,執行下面的代碼:
>>>import cv2
>>>events = [i for i in dir(cv2) if 'EVENT' in i]
>>>print events
創建一個鼠標回調函數有通用的格式。區別只是這個函數是做什么的。所以我們的鼠標回調函數只做一件事,雙擊的時候畫一個圓。
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()
更多高級列子
現在我們來看更多更好的例子。在這里,我們通過拖拽鼠標畫矩形或者圓(由我們選擇的模式決定)。所以我們的鼠標回調函數有兩個部分,一個是畫矩形,另一個是畫圓。這個例子在創建和理解交互應用上很有用,比如對象跟蹤,圖片分割等。
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)
然后我們把這個回調函數綁定到OpenCV的窗口。在主循環里,我們應該設置一個鍵'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()