python opencv鼠標(biāo)交互操作的實(shí)用指南
opencv的鼠標(biāo)交互操作主要通過兩個(gè)函數(shù)實(shí)現(xiàn):
- 第一個(gè)是cv2.setMouseCallback(windowName, onMouse [, param])
- 第二個(gè)是setMouseCallback()的第二個(gè)參數(shù),稱為鼠標(biāo)回調(diào)函數(shù)onMouse(event, x, y, flags, param)
下面分別對二者進(jìn)行說明,并舉一個(gè)簡單的例子說明其用法。
cv2.setMouseCallback(windowName, onMouse [, param])
參數(shù)說明:
- windowName:必需。類似于cv.imshow()函數(shù),opencv具體操作哪個(gè)窗口以窗口名作為識(shí)別標(biāo)識(shí),這有點(diǎn)類似窗口句柄的概念。
- onMouse:必需。鼠標(biāo)回調(diào)函數(shù)。鼠標(biāo)回調(diào)函數(shù)的定義是onMouse(event, x, y, flags, param),我們想要做什么鼠標(biāo)操作,都是在這個(gè)函數(shù)內(nèi)實(shí)現(xiàn)。
- param:可選。請注意到onMouse里面也有一個(gè)param參數(shù),它與是setMouseCallback里的param是同一個(gè),更直白一點(diǎn)說,這個(gè)param是onMouse和setMouseCallback之間的參數(shù)通信接口。
鼠標(biāo)回調(diào)函數(shù):onMouse(event, x, y, flags, param)
這個(gè)參數(shù)列表不要改變它,除了param外其他都是由回調(diào)函數(shù)自動(dòng)獲取值。
參數(shù)說明:
- event:由回調(diào)函數(shù)根據(jù)鼠標(biāo)對圖像的操作自動(dòng)獲得,內(nèi)容包含左鍵點(diǎn)擊,左鍵彈起,右鍵點(diǎn)擊...等等等非常多的操作。
- x,y:由回調(diào)函數(shù)自動(dòng)獲得,記錄了鼠標(biāo)當(dāng)前位置的坐標(biāo),坐標(biāo)以圖像左上角為原點(diǎn)(0, 0),x方向向右為正,y方向向下為正。
- flags:記錄了一些專門的操作,下面有說明。
- param:從setMouseCallback()里傳遞過來的參數(shù)。該參數(shù)在setMouseCallback()處是可選參數(shù),所以可以不設(shè)置。
event和flags的種類:
可以使用如下代碼獲得event的種類
# -*- coding: utf-8 -*- import cv2 events = [i for i in dir(cv2) if 'EVENT' in i] print(events)
結(jié)果分為兩部分,下面以EVENT_FLAG_開頭的是flags對應(yīng)的狀態(tài),其它的是event對應(yīng)的狀態(tài)。
flags和event似乎不能同時(shí)起作用,也就是說,我們無法通過同時(shí)判斷這兩個(gè)條件來實(shí)現(xiàn)組合鍵操作。
[‘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_MOUSEHWHEEL', ‘EVENT_MOUSEMOVE', ‘EVENT_MOUSEWHEEL', ‘EVENT_RBUTTONDBLCLK', ‘EVENT_RBUTTONDOWN', ‘EVENT_RBUTTONUP']
示例
下面是一個(gè)簡單的示例,運(yùn)行程序后,我們可以通過鼠標(biāo)左鍵單擊來畫一些十字線。
# -*- coding: utf-8 -*- import cv2 import numpy as np WIN_NAME = 'pick_points' def onmouse_pick_points(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: print('x = %d, y = %d' % (x, y)) cv2.drawMarker(param, (x, y), (0, 255, 0)) if __name__ == '__main__': image = np.zeros((256, 256, 3), np.uint8) cv2.namedWindow(WIN_NAME, 0) cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, image) while True: cv2.imshow(WIN_NAME, image) key = cv2.waitKey(30) if key == 27: # ESC break cv2.destroyAllWindows()
上面程序中有幾個(gè)注意點(diǎn):
- setMouseCallback()中的param參數(shù)我們傳遞了image進(jìn)去,也就是說鼠標(biāo)回調(diào)函數(shù)onmouse_pick_points()中的param就是image,畫十字線的操作在鼠標(biāo)回調(diào)函數(shù)中,該參數(shù)在onmouse_pick_points中的變化可以保留到函數(shù)外,可以理解為C++的引用傳遞,或C語言的指針傳遞。
- 需要一個(gè)無限循環(huán)來刷新圖像。
- 無限循環(huán)的退出條件由鍵盤獲取,cv2.waitKey()用來獲取鍵盤的按鍵,當(dāng)我們點(diǎn)ESC后就可以退出。
這里點(diǎn)了三次左鍵,終端輸出以下內(nèi)容:
x = 60, y = 55 x = 206, y = 113 x = 114, y = 192
并得到這樣一張圖像:
總結(jié)
到此這篇關(guān)于python opencv鼠標(biāo)交互操作的文章就介紹到這了,更多相關(guān)python opencv鼠標(biāo)交互操作內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。