目錄
前言
目標
函數(shù)詳解
1、cv2.setMouseCallback()鼠標回調(diào)函數(shù)
2、鼠標事件簡介
代碼演示
?編輯
應(yīng)用演示
運行效果
參考
前言
跟著官網(wǎng)學(xué)習(xí)才是基礎(chǔ)入門的最佳選擇,下文是opencv-python官網(wǎng)的學(xué)習(xí)記錄及擴展!
目標
學(xué)習(xí)函數(shù)cv2.setMouseCallback()并使用鼠標繪制不同圖形(矩形、多邊形等)。
函數(shù)詳解
1、cv2.setMouseCallback()鼠標回調(diào)函數(shù)
cv2.setMouseCallback(windowName, onMouse, param=None)
windowName ?窗體名稱
onMouse ?鼠標事件的回調(diào)函數(shù)
param?? ?傳遞給回調(diào)函數(shù)的可選參數(shù)
2、鼠標事件簡介
查看所有被支持的鼠標事件
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print (events)
鼠標事件標志 MouseEventFlags
'EVENT_FLAG_ALTKEY' ? ? 表示按下 ALT 鍵.
'EVENT_FLAG_CTRLKEY' ? ?表示按下 CTRL 鍵.
'EVENT_FLAG_SHIFTKEY' ? 表示按下 SHIFT 鍵.
'EVENT_FLAG_LBUTTON' ? ?表示鼠標左鍵已按下.
'EVENT_FLAG_MBUTTON' ? ?表示鼠標中鍵已按下.
'EVENT_FLAG_RBUTTON' ? ?表示鼠標右鍵已按下.
鼠標事件類型?MouseEventTypes
'EVENT_LBUTTONDBLCLK' ??表示雙擊鼠標左鍵.
'EVENT_LBUTTONDOWN' 表示按下鼠標左鍵.
'EVENT_LBUTTONUP' ??表示釋放鼠標左鍵.
'EVENT_MBUTTONDBLCLK' ??表示雙擊鼠標中鍵.
'EVENT_MBUTTONDOWN' 表示按下鼠標中鍵.
'EVENT_MBUTTONUP' ??表示釋放鼠標中鍵.
'EVENT_MOUSEHWHEEL' 正值和負值分別表示向右和向左滾動.
'EVENT_MOUSEMOVE' ??指示鼠標指針已移到窗口上.
'EVENT_MOUSEWHEEL' ?正值和負值分別表示向前和向后滾動.
'EVENT_RBUTTONDBLCLK' ??表示雙擊鼠標右鍵.
'EVENT_RBUTTONDOWN' 表示按下鼠標右鍵.
'EVENT_RBUTTONUP' ??表示釋放鼠標右鍵.
代碼演示
在圖片上雙擊過的位置繪制一個圓,創(chuàng)建鼠標事件回調(diào)函數(shù),當鼠標事件發(fā)生時就會被執(zhí)行,
比如左鍵按下,松開,左鍵雙擊等。
可以通過鼠標事件獲得相對應(yīng)的圖片上的坐標,根據(jù)這些信息可以做想做的事。
所有鼠標事件回調(diào)函數(shù)都有一個統(tǒng)一的格式,不同的地方是被調(diào)用后的功能。
import numpy as np
import cv2 as cv
# mouse callback function
def draw_circle(event,x,y,flags,param):
? ? if event == cv.EVENT_LBUTTONDBLCLK:
? ? ? ? cv.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)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
? ? cv.imshow('image',img)
? ? if cv.waitKey(20) & 0xFF == 27:
? ? ? ? break
cv.destroyAllWindows()
?
應(yīng)用演示
通過鍵盤按鍵‘m'切換繪圖類型曲線或矩形,并使用鼠標繪制。
import cv2
import numpy as np
# 當鼠標按下時為True
drawing = False
# 如果mode為true時繪制矩形,按下'm'變成繪制曲線
mode = True
ix, iy = -1, -1
# 創(chuàng)建回調(diào)函數(shù)
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
print(ix, iy, x, y)
'''
下面把回調(diào)函數(shù)與OpenCV窗口綁定在一起,在主循環(huán)中獎'm'鍵與模式轉(zhuǎn)換綁定在一起
'''
img = cv2.imread('../Resources/lena.png')#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)
if k == ord('m'):
mode = not mode
elif k == ord('q') or k == 27:
break
cv2.destroyAllWindows()
運行效果
下圖為代碼運行效果,通過鼠標在圖像上繪制矩形和曲線
?
參考
OpenCV: OpenCV-Python Tutorials文章來源:http://www.zghlxwxcb.cn/news/detail-775122.html
學(xué)習(xí)、進步、堅持。。。內(nèi)容不間斷更新中。。。文章來源地址http://www.zghlxwxcb.cn/news/detail-775122.html
到了這里,關(guān)于【跟官網(wǎng)學(xué)opencv-python】筆記1.3:opencv鼠標繪圖 cv2.setMouseCallback()的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!