使用工具:Python3.5
涉及包:cv2
函數:cv2.setMouseCallback()
簡單的程序,在圖片上雙擊過的位置繪制一個圓圈
1.創建鼠標事件回調函數,當鼠標事件發生時就會被執行。
比如左鍵按下,松開,左鍵雙擊等。可以通過鼠標事件獲得相對應的圖片上的坐標,根據這些信息可以做想做的事。所有鼠標事件回調函數都有一個統一的格式,不同的地方是被調用后的功能。
~~~
#查看所有被支持的鼠標事件
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)
# 創建圖像與窗口并將窗口與回調函數綁定
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while (1):
cv2.imshow('image', img)
if cv2.waitKey(1)&0xFF == ord('q'):#按q鍵退出
break
cv2.destroyAllWindows()
~~~
高級點程序
根據我們選擇的模式在拖動鼠標時繪制矩形。所以回調函數包含兩個部分。
~~~
import cv2
import numpy as np
#當鼠標按下時為True
drawing = False
#如果mode為true時繪制矩形,按下'm'變成繪制曲線
mode = True
ix,iy = -1,-1
#創建回調函數
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
#當按下左鍵時返回起始位置坐標
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy=x,y
#當左鍵按下并移動時繪制圖形,event可以查看移動,flag查看是否按下
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
#繪制圓圈,小圓點連在一起就成了線,3代表筆畫的粗細
cv2.circle(img,(x,y),3,(0,0,255),-1)
#當鼠標松開時停止繪圖
elif event ==cv2.EVENT_LBUTTONUP:
drawing == False
'''
下面把回調函數與OpenCV窗口綁定在一起,在主循環中獎'm'鍵與模式轉換綁定在一起
'''
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k=cv2.waitKey(1)
if k ==ord('m'):
mode=not mode
elif k==ord('q'):
break
cv2.destroyAllWindows()
~~~