外國(guó)人做網(wǎng)站百度一下你就知道了 官網(wǎng)
參考學(xué)習(xí)來(lái)自
文章目錄
- 背景知識(shí)
- cv2.setMouseCallback 介紹
- 小試牛刀
背景知識(shí)
GUI(Graphical User Interface,圖形用戶界面) 是一種允許用戶通過(guò)圖形元素(如窗口、圖標(biāo)、菜單和按鈕)與電子設(shè)備進(jìn)行交互的界面。與傳統(tǒng)的命令行界面(CLI,Command Line Interface) 相比,GUI 提供了更加直觀和易于使用的界面,使得用戶無(wú)需記憶復(fù)雜的命令或語(yǔ)法即可操作設(shè)備。
GUI 的主要組成部分包括:
- 窗口:屏幕上可以獨(dú)立移動(dòng)和縮放的矩形區(qū)域,用于顯示內(nèi)容或執(zhí)行特定任務(wù)。
- 圖標(biāo):表示程序、文件、文件夾或命令的小型圖像。
- 菜單:列出可用命令或選項(xiàng)的列表,用戶可以通過(guò)鼠標(biāo)或鍵盤(pán)選擇。
- 按鈕:用戶可以點(diǎn)擊以執(zhí)行特定命令或操作的圖形元素。
- 文本框:允許用戶輸入和編輯文本的區(qū)域。
- 對(duì)話框:臨時(shí)窗口,用于接收用戶輸入或顯示信息。
- 滾動(dòng)條:允許用戶滾動(dòng)查看長(zhǎng)列表或大量?jī)?nèi)容的小部件。
- 工具欄:包含常用命令或操作的圖標(biāo)按鈕集合。
- 光標(biāo):屏幕上的指示器,顯示用戶當(dāng)前正在操作的位置。
GUI 的設(shè)計(jì)旨在提高用戶體驗(yàn)和效率,使用戶能夠更輕松地完成任務(wù)。不同的操作系統(tǒng)和應(yīng)用程序可能會(huì)使用不同的 GUI 風(fēng)格和約定,但大多數(shù) GUI 都遵循相似的交互原則和設(shè)計(jì)規(guī)范。
在計(jì)算機(jī)視覺(jué)和圖像處理領(lǐng)域,GUI 通常用于顯示圖像、視頻或處理結(jié)果,以及允許用戶通過(guò)界面進(jìn)行參數(shù)調(diào)整、圖像編輯或選擇等操作。OpenCV 是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),雖然它本身主要關(guān)注圖像處理和分析的算法實(shí)現(xiàn),但它也提供了一些基本的 GUI 功能,如圖像顯示、滑動(dòng)條和鼠標(biāo)事件處理等,以便用戶能夠更方便地與圖像數(shù)據(jù)進(jìn)行交互。然而,對(duì)于更復(fù)雜的 GUI 需求,開(kāi)發(fā)人員通常會(huì)使用專門的 GUI 工具包或框架來(lái)構(gòu)建應(yīng)用程序界面。
在 OpenCV 中,GUI(圖形用戶界面)功能主要用于顯示圖像、處理用戶輸入(如鼠標(biāo)點(diǎn)擊和鍵盤(pán)按鍵)以及創(chuàng)建簡(jiǎn)單的交互界面。OpenCV 提供了一些基本的 GUI 功能,如顯示圖像窗口、設(shè)置鼠標(biāo)和鍵盤(pán)回調(diào)函數(shù)、滑動(dòng)條(Trackbar)等。
這些功能使得 OpenCV 在圖像處理和計(jì)算機(jī)視覺(jué)任務(wù)中非常有用,尤其是當(dāng)你需要與用戶進(jìn)行交互時(shí)。然而,如果你需要更復(fù)雜的 GUI 功能(如按鈕、文本框等),那么可能需要考慮使用其他庫(kù),如 Tkinter、PyQt、wxPython 等,這些庫(kù)提供了更豐富的 GUI 控件和更強(qiáng)大的功能。
cv2.setMouseCallback 介紹
cv2.setMouseCallback 是 OpenCV 庫(kù)中用于設(shè)置鼠標(biāo)回調(diào)函數(shù)的方法。它允許開(kāi)發(fā)者在 OpenCV 窗口中進(jìn)行鼠標(biāo)交互操作,如鼠標(biāo)點(diǎn)擊、拖動(dòng)等。以下是關(guān)于 cv2.setMouseCallback 的中文文檔,包含其用法、參數(shù)說(shuō)明以及使用示例。
一、函數(shù)用途
cv2.setMouseCallback 用于設(shè)置鼠標(biāo)回調(diào)函數(shù),以便在 OpenCV 窗口中檢測(cè)和處理鼠標(biāo)事件(如左鍵點(diǎn)擊、右鍵點(diǎn)擊等)。
二、函數(shù)語(yǔ)法
cv2.setMouseCallback(windowName, onMouseCallback[, userdata=None])
參數(shù)說(shuō)明
- windowName(必填):字符串類型,表示要綁定鼠標(biāo)回調(diào)函數(shù)的窗口名稱。這個(gè)窗口需要先通過(guò) cv2.namedWindow() 函數(shù)創(chuàng)建。
- onMouseCallback(必填):一個(gè)回調(diào)函數(shù),用于處理鼠標(biāo)事件。當(dāng)在 windowName 指定的窗口中發(fā)生鼠標(biāo)事件時(shí),該函數(shù)將被調(diào)用。該函數(shù)需要接收五個(gè)參數(shù):
- event:整數(shù)類型,表示鼠標(biāo)事件類型(如左鍵點(diǎn)擊、右鍵點(diǎn)擊等)。
- x:整數(shù)類型,表示鼠標(biāo)事件發(fā)生的 x 坐標(biāo)(以像素為單位)。
- y:整數(shù)類型,表示鼠標(biāo)事件發(fā)生的 y 坐標(biāo)(以像素為單位)。
- flags:整數(shù)類型,表示鼠標(biāo)事件的標(biāo)志(如鼠標(biāo)按鍵狀態(tài)、鼠標(biāo)拖動(dòng)狀態(tài)等)。
- param:可選參數(shù),傳遞給回調(diào)函數(shù)的附加數(shù)據(jù)(如果有的話)。
- userdata(可選):傳遞給 onMouseCallback 的附加參數(shù)。如果沒(méi)有提供,則默認(rèn)為 None。
三、鼠標(biāo)事件類型
OpenCV 支持多種鼠標(biāo)事件類型,包括:
cv2.EVENT_LBUTTONDOWN:左鍵按下事件。
cv2.EVENT_LBUTTONUP:左鍵釋放事件。
cv2.EVENT_RBUTTONDOWN:右鍵按下事件。
cv2.EVENT_RBUTTONUP:右鍵釋放事件。
cv2.EVENT_MBUTTONDOWN:中鍵按下事件。
cv2.EVENT_MBUTTONUP:中鍵釋放事件。
cv2.EVENT_MOUSEMOVE:鼠標(biāo)移動(dòng)事件。
小試牛刀
import cv2# 列表來(lái)存儲(chǔ)邊界框坐標(biāo)
top_left_corner = []
bottom_right_corner = []# 函數(shù)將在鼠標(biāo)輸入時(shí)被調(diào)用
def drawRectangle(action, x, y, flags, *param):# 引用全局變量global top_left_corner, bottom_right_corner# 當(dāng)按下鼠標(biāo)左鍵時(shí),標(biāo)記左上角if action == cv2.EVENT_LBUTTONDOWN:top_left_corner = [(x, y)]# 當(dāng)松開(kāi)鼠標(biāo)左鍵時(shí),標(biāo)記右下角,與此同時(shí)畫(huà)框elif action == cv2.EVENT_LBUTTONUP:bottom_right_corner = [(x, y)]# 畫(huà)矩形cv2.rectangle(image, top_left_corner[0], bottom_right_corner[0], (0, 255, 0), 2, 8)cv2.imshow("Window", image)# 讀取圖片
image = cv2.imread("1.jpg")
# 制作臨時(shí)圖像
temp = image.copy()
# 創(chuàng)建命名窗口
cv2.namedWindow("Window")
# 鼠標(biāo)事件發(fā)生時(shí)調(diào)用的 Highgui 函數(shù)
cv2.setMouseCallback("Window", drawRectangle)k = 0
# 按下q鍵關(guān)閉窗口
while k != 113: # q# 顯示圖像cv2.imshow("Window", image)k = cv2.waitKey(0)# 如果按下c,使用虛擬圖像清除窗口if k == 99: # cimage = temp.copy()cv2.imshow("Window", image)cv2.destroyAllWindows()
輸入圖片
鼠標(biāo)拖動(dòng)畫(huà)框
按 c 鍵 清空所繪制的矩形框,通過(guò)顯示一個(gè)新的原始圖片來(lái)實(shí)現(xiàn)
按 q 鍵退出程序