python opencv鼠標(biāo)交互操作的實(shí)用指南
前言
opencv的鼠標(biāo)交互操作主要通過(guò)兩個(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)
下面分別對(duì)二者進(jìn)行說(shuō)明,并舉一個(gè)簡(jiǎn)單的例子說(shuō)明其用法。
cv2.setMouseCallback(windowName, onMouse [, param])
參數(shù)說(shuō)明:
- 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:可選。請(qǐng)注意到onMouse里面也有一個(gè)param參數(shù),它與是setMouseCallback里的param是同一個(gè),更直白一點(diǎn)說(shuō),這個(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ù)說(shuō)明:
- event:由回調(diào)函數(shù)根據(jù)鼠標(biāo)對(duì)圖像的操作自動(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:記錄了一些專門的操作,下面有說(shuō)明。
- param:從setMouseCallback()里傳遞過(guò)來(lái)的參數(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_開(kāi)頭的是flags對(duì)應(yīng)的狀態(tài),其它的是event對(duì)應(yīng)的狀態(tài)。
flags和event似乎不能同時(shí)起作用,也就是說(shuō),我們無(wú)法通過(guò)同時(shí)判斷這兩個(gè)條件來(lái)實(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è)簡(jiǎn)單的示例,運(yùn)行程序后,我們可以通過(guò)鼠標(biāo)左鍵單擊來(lái)畫一些十字線。
# -*- 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)去,也就是說(shuō)鼠標(biāo)回調(diào)函數(shù)onmouse_pick_points()中的param就是image,畫十字線的操作在鼠標(biāo)回調(diào)函數(shù)中,該參數(shù)在onmouse_pick_points中的變化可以保留到函數(shù)外,可以理解為C++的引用傳遞,或C語(yǔ)言的指針傳遞。
- 需要一個(gè)無(wú)限循環(huán)來(lái)刷新圖像。
- 無(wú)限循環(huán)的退出條件由鍵盤獲取,cv2.waitKey()用來(lái)獲取鍵盤的按鍵,當(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jupyter Notebook切換conda虛擬環(huán)境的實(shí)現(xiàn)步驟
本文主要介紹了Jupyter Notebook切換conda虛擬環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Python使用pymongo模塊操作MongoDB的方法示例
這篇文章主要介紹了Python使用pymongo模塊操作MongoDB的方法,結(jié)合實(shí)例形式分析了Python基于pymongo模塊連接MongoDB數(shù)據(jù)庫(kù)以及增刪改查與日志記錄相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Python 判斷 有向圖 是否有環(huán)的實(shí)例講解
下面小編就為大家分享一篇Python 判斷 有向圖 是否有環(huán)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02python關(guān)于倒排列的知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于python關(guān)于倒排列的知識(shí)點(diǎn)總結(jié),有需要的朋友們可以參考下。2020-10-10python實(shí)現(xiàn)簡(jiǎn)易淘寶購(gòu)物
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易淘寶購(gòu)物,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Python 開(kāi)發(fā)工具通過(guò) agent 代理使用的方法
這篇文章主要介紹了Python 開(kāi)發(fā)工具通過(guò) agent 代理使用的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python Locals變量管理新嘗試引領(lǐng)代碼風(fēng)潮
在Python中,locals()函數(shù)是一個(gè)強(qiáng)大的工具,它使程序員能夠訪問(wèn)和操作當(dāng)前作用域內(nèi)的局部變量,本文將深入探討locals()函數(shù)的功能、應(yīng)用和重要性2024-01-01