python opencv鼠標(biāo)交互操作的實(shí)用指南
前言
opencv的鼠標(biāo)交互操作主要通過兩個函數(shù)實(shí)現(xiàn):
- 第一個是cv2.setMouseCallback(windowName, onMouse [, param])
- 第二個是setMouseCallback()的第二個參數(shù),稱為鼠標(biāo)回調(diào)函數(shù)onMouse(event, x, y, flags, param)
下面分別對二者進(jìn)行說明,并舉一個簡單的例子說明其用法。
cv2.setMouseCallback(windowName, onMouse [, param])
參數(shù)說明:
- windowName:必需。類似于cv.imshow()函數(shù),opencv具體操作哪個窗口以窗口名作為識別標(biāo)識,這有點(diǎn)類似窗口句柄的概念。
- onMouse:必需。鼠標(biāo)回調(diào)函數(shù)。鼠標(biāo)回調(diào)函數(shù)的定義是onMouse(event, x, y, flags, param),我們想要做什么鼠標(biāo)操作,都是在這個函數(shù)內(nèi)實(shí)現(xiàn)。
- param:可選。請注意到onMouse里面也有一個param參數(shù),它與是setMouseCallback里的param是同一個,更直白一點(diǎn)說,這個param是onMouse和setMouseCallback之間的參數(shù)通信接口。
鼠標(biāo)回調(diào)函數(shù):onMouse(event, x, y, flags, param)
這個參數(shù)列表不要改變它,除了param外其他都是由回調(diào)函數(shù)自動獲取值。
參數(shù)說明:
- event:由回調(diào)函數(shù)根據(jù)鼠標(biāo)對圖像的操作自動獲得,內(nèi)容包含左鍵點(diǎn)擊,左鍵彈起,右鍵點(diǎn)擊...等等等非常多的操作。
- x,y:由回調(diào)函數(shù)自動獲得,記錄了鼠標(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í)現(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']
示例
下面是一個簡單的示例,運(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()
上面程序中有幾個注意點(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語言的指針傳遞。
- 需要一個無限循環(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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
高考要來啦!用Python爬取歷年高考數(shù)據(jù)并分析
轉(zhuǎn)眼間,高考的日子又要來臨了,不知道高考學(xué)子們準(zhǔn)備的怎么樣了,今天這篇文章簡單且隨意地分析一下高考的一些數(shù)據(jù),需要的朋友可以參考下2021-06-06
Python?PaddleNLP開源實(shí)現(xiàn)快遞單信息抽取
這篇文章主要為大家介紹了Python?PaddleNLP開源項(xiàng)目實(shí)現(xiàn)對快遞單信息抽取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
OpenCV學(xué)習(xí)之圖像加噪與濾波的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了OpenCV中圖像的加噪與濾波操作的相關(guān)資料,文中的示例代碼簡潔易懂,具有一定的借鑒價值,需要的可以參考一下2023-02-02
Python高級技巧之利用psutil和subprocess實(shí)現(xiàn)程序監(jiān)控與管理
本文介紹了如何使用Python的psutil和subprocess模塊監(jiān)控程序運(yùn)行狀態(tài),并提供了一個案例腳本,用于監(jiān)控目標(biāo)程序并在停止時自動重啟,詳細(xì)介紹了subprocess模塊的基本用法和psutil模塊的系統(tǒng)信息獲取、進(jìn)程管理及資源監(jiān)控功能,需要的朋友可以參考下2024-09-09
python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn)
在Python中,getattr和getattribute是用于動態(tài)屬性訪問和自定義屬性訪問行為的重要工具,本文主要介紹了python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01

