-
目標(biāo)
- 學(xué)習(xí) opencv的鼠標(biāo)事件和鼠標(biāo)事件回調(diào)函數(shù)cv2.setMouseCallback()的使用胰柑。
- 根據(jù)獲取到的鼠標(biāo)的位置坐標(biāo)繪制不同的圖形。
-
示例代碼
- 查看opencv支持的鼠標(biāo)事件
python
# -*- coding:utf-8-*-
import numpy as np
import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print events
輸出結(jié)果
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY',
'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON',
'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY',
'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN',
'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK',
'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP',
'EVENT_MOUSEMOVE', 'EVENT_RBUTTONDBLCLK',
'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
- 利用鼠標(biāo)事件,以圖片上雙擊的位置為中心妇斤,繪制一個(gè)圓
python
# -*- coding:utf-8-*-
import numpy as np
import cv2
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x, y), 100, (255, 0, 0), -1)
# 新建圖像窗口并將窗口與回調(diào)函數(shù)綁定
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while (1):
# 顯示圖像并且按鍵盤上的**ESC**鍵即可關(guān)閉窗口
cv2.imshow('image', img)
if cv2.waitKey(20) & 0xFF == 27:
break
# 最后銷毀窗口
cv2.destroyAllWindows()
顯示結(jié)果
以雙擊鼠標(biāo)的位置為圓心椎组,100px為半徑,畫出的圓如下
雙擊鼠標(biāo)后畫出的圓
- 利用鼠標(biāo)事件赶盔,拖動(dòng)鼠標(biāo)時(shí)繪制矩形或圓
python
# -*- coding:utf-8-*-
import numpy as np
import cv2
# 默認(rèn)繪圖狀態(tài)不可用企锌,為False,當(dāng)鼠標(biāo)按下時(shí)值為True
drawing = False
# mode為True時(shí)畫矩形招刨,值為False時(shí)畫圓
mode = True
# 定義x1, y1兩個(gè)值
x1, y1 = -1, -1
# 創(chuàng)建回調(diào)函數(shù)
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
# 按下鼠標(biāo)左鍵時(shí)返回起始位置坐標(biāo)
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
x1, y1 = x, y
# 當(dāng)鼠標(biāo)左鍵按下并移動(dòng)時(shí)繪制圖形
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
# (x1, y1)為矩形起點(diǎn)霎俩,矩形顏色為(0, 255, 0)哀军,線條粗細(xì)為1px
cv2.rectangle(img, (x1, y1), (x, y), (0, 255, 0),1)
else:
# 起始點(diǎn)為圓心,起點(diǎn)到終點(diǎn)為半徑的圓
r=int(np.sqrt((x-x1)**2+(y-y1)**2))
cv2.circle(img,(x,y),r,(0,0,255),-1)
# 當(dāng)鼠標(biāo)松開停止繪畫
elif event==cv2.EVENT_LBUTTONUP:
drawing==False
# 新建圖像窗口并將窗口與回調(diào)函數(shù)綁定
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
# 鍵盤輸入**m**時(shí)打却,畫圓
if k==ord('m'):
mode=not mode
elif k==27:
break
cv2.destroyAllWindows()
顯示結(jié)果
矩形和圓
注:在拖動(dòng)鼠標(biāo)移動(dòng)的過程中杉适,隨著鼠標(biāo)的移動(dòng)會(huì)不斷地畫圓和矩形。
若利用鼠標(biāo)拖動(dòng)畫圓柳击,最后畫出的可能是一條線猿推,將上述畫起點(diǎn)到終點(diǎn)為半徑的圓的代碼改為如下代碼
cv2.circle(img,(x,y),3,(0,0,255),-1)
表示以拖動(dòng)時(shí)的鼠標(biāo)位置為圓心,半徑為3px的圓捌肴,結(jié)果如下
圓組成的線圈
可見在鼠標(biāo)拖動(dòng)過程中會(huì)不斷以起始點(diǎn)為圓心蹬叭,不斷畫圓。