詳解OpenCV中簡(jiǎn)單的鼠標(biāo)事件處理
談及鼠標(biāo)事件,就是在觸發(fā)鼠標(biāo)按鈕后程序所做出相應(yīng)的反應(yīng),但是不影響程序的整個(gè)線程。這有些像異步處理。鼠標(biāo)事件響應(yīng)不會(huì)一直等著我們?nèi)グ炊罄m(xù)程序不執(zhí)行,這樣會(huì)造成阻塞,而是在我們不按鼠標(biāo)的時(shí)候程序也會(huì)正常進(jìn)行,按的時(shí)候會(huì)調(diào)用鼠標(biāo)的事件響應(yīng),這個(gè)過(guò)程就像程序一邊正常運(yùn)行一邊等待鼠標(biāo)響應(yīng)。
為了將鼠標(biāo)響應(yīng)和操作畫(huà)面進(jìn)行綁定,我們要?jiǎng)?chuàng)建一個(gè)回調(diào)函數(shù):
cv2.setMouseCallback函數(shù)語(yǔ)法
cv2.setMouseCallback(img,onMouse)
cv2.setMouseCallback函數(shù)參數(shù)解釋:
img
:要綁定畫(huà)面的名字
onMouse
:響應(yīng)函數(shù),即當(dāng)鼠標(biāo)事件觸發(fā)時(shí)調(diào)用的函數(shù)。
示例代碼:
cv2.setMouseCallback('image',draw_circle)
舉個(gè)例子:
當(dāng)我們?cè)诋?huà)面內(nèi)單擊的時(shí)候,會(huì)回調(diào)draw_circle函數(shù),而這個(gè)被調(diào)用的函數(shù)成為響應(yīng)函數(shù),它的作用是畫(huà)一個(gè)圓。調(diào)用這個(gè)函數(shù)后,我們就實(shí)現(xiàn)了畫(huà)面與回調(diào)函數(shù)的綁定。
011-2-鼠標(biāo)事件
查看所有被支持的鼠標(biāo)事件:
import cv2 events = [i for i in dir(cv2) if 'EVENT' in i] print(events)
程序顯示的鼠標(biāo)事件:
['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']
回調(diào)函數(shù)
在OpenCV中沒(méi)有特定的寫(xiě)好的回調(diào)函數(shù)供我們直接使用,這需要我們自己編寫(xiě),回調(diào)函數(shù)的模板如下:
def draw_circle(event,x,y,flags,param): if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),100,(255,0,0),-1)
函數(shù)分析:
代碼第一行:是我們?cè)O(shè)置的函數(shù)名draw_circle以及它的參數(shù),第一個(gè)參數(shù)event表示在什么事件下調(diào)用這個(gè)函數(shù),x ,y可以理解為圖像中鼠標(biāo)指針?biāo)诘南袼攸c(diǎn)的坐標(biāo)值,后面兩個(gè)參數(shù)暫時(shí)不用理解。
代碼第二行:是事件的判定,如果發(fā)出了該事件,那么執(zhí)行第三行的代碼。
下面我們來(lái)通過(guò)雙擊鼠標(biāo)左鍵畫(huà)一個(gè)圓:
import cv2 import numpy as np #設(shè)置回調(diào)函數(shù) def draw_circle(event,x,y,flags,param): if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),100,(255,0,0),-1) #創(chuàng)建圖像與窗口并將窗口與回調(diào)函數(shù)進(jìn)行綁定 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'): break cv2.destroyAllWindows()
結(jié)果:
在通過(guò)拖動(dòng)鼠標(biāo)畫(huà)一個(gè)矩形:
import cv2 import numpy as np #按下鼠標(biāo)時(shí)為T(mén)rue drawing = False #當(dāng)mode為true時(shí)繪制矩形,按下m后mode變成false,用來(lái)繪制曲線 mode = True ix,iy=-1,-1 #設(shè)置回調(diào)函數(shù) def draw_circle(event,x,y,flags,param): global ix,iy,drawing,mode #當(dāng)單擊時(shí)返回起始位置坐標(biāo) if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix,iy=x,y #當(dāng)移動(dòng)鼠標(biāo)時(shí)繪制圖形,event可以查看移動(dòng)效果,flag檢測(cè)是否發(fā)生單擊 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: #繪制圓圈,圓點(diǎn)連成線,3代表筆的粗細(xì) cv2.circle(img,(x,y),3,(0,255,0),-1) #當(dāng)松開(kāi)鼠標(biāo)時(shí)停止繪制 elif event == cv2.EVENT_LBUTTONUP: drawing ==False #創(chuàng)建圖像與窗口并將窗口與回調(diào)函數(shù)進(jìn)行綁定 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 elif k == ord('r'): img = np.zeros((500,500,3),np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle) cv2.destroyAllWindows()
結(jié)果:
到此這篇關(guān)于詳解OpenCV中簡(jiǎn)單的鼠標(biāo)事件處理的文章就介紹到這了,更多相關(guān)OpenCV鼠標(biāo)事件處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中re.findall函數(shù)實(shí)例用法
在本篇文章里小編給大家整理了一篇關(guān)于python中re.findall函數(shù)實(shí)例用法相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-09-09Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法
這篇文章主要給大家介紹了關(guān)于Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法,分享出來(lái),對(duì)同樣遇到這個(gè)問(wèn)題的朋友們一個(gè)參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)
這篇文章主要介紹了K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn),幫助大家更好的利用python實(shí)現(xiàn)機(jī)器學(xué)習(xí),感興趣的朋友可以了解下2021-01-01django在開(kāi)發(fā)中取消外鍵約束的實(shí)現(xiàn)
這篇文章主要介紹了django在開(kāi)發(fā)中取消外鍵約束的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python實(shí)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)中棧的操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)中棧的操作,包括基于Python實(shí)現(xiàn)棧的定義、入棧、出棧、判斷??栈驐M等情況,需要的朋友可以參考下2017-12-12python中列表推導(dǎo)式與生成器表達(dá)式對(duì)比詳解
python當(dāng)然不是一門(mén)編譯型語(yǔ)言,但是它還是要被解析成二進(jìn)制的字節(jié)碼才能被執(zhí)行,執(zhí)行它的正是python解釋器,下面這篇文章主要給大家介紹了關(guān)于python中列表推導(dǎo)式與生成器表達(dá)式對(duì)比的相關(guān)資料,需要的朋友可以參考下2023-01-01python數(shù)據(jù)挖掘使用Evidently創(chuàng)建機(jī)器學(xué)習(xí)模型儀表板
在本文中,我們將探索 Evidently 并創(chuàng)建交互式報(bào)告/儀表板。有需要的朋友歡迎大家收藏學(xué)習(xí),希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11unittest+coverage單元測(cè)試代碼覆蓋操作實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了unittest+coverage單元測(cè)試代碼覆蓋操作的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04