使用OpenCV實現(xiàn)鼠標事件回調(diào)功能并繪制圖形
概述
OpenCV 是一個強大的計算機視覺庫,廣泛應(yīng)用于圖像處理和視頻分析等領(lǐng)域。本文將詳細介紹如何使用 OpenCV 實現(xiàn)鼠標事件回調(diào)功能,通過鼠標操作在圖像上繪制圓圈和矩形。我們將通過兩個示例程序來展示這一功能。
環(huán)境準備
確保已經(jīng)安裝了 OpenCV 庫。可以使用以下命令安裝:
pip install opencv-python
示例一:雙擊鼠標左鍵繪制圓圈
代碼詳解
import numpy as np
import cv2 as cv
# 鼠標回調(diào)函數(shù)
def draw_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), 100, (255, 0, 0), -1)
# 創(chuàng)建一個黑色圖像,一個窗口,并綁定函數(shù)到窗口
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
while True:
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == 27: # 按下 ESC 鍵退出
break
cv.destroyAllWindows()
代碼解析
1. 導(dǎo)入必要的庫
import numpy as np import cv2 as cv
import numpy as np:導(dǎo)入 NumPy 庫,并將其別名為 np,用于創(chuàng)建和操作數(shù)組。
import cv2 as cv:導(dǎo)入 OpenCV 庫,并將其別名為 cv,用于圖像處理和窗口管理。
2. 定義鼠標回調(diào)函數(shù)
def draw_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), 100, (255, 0, 0), -1)
def draw_circle(event, x, y, flags, param):定義一個鼠標回調(diào)函數(shù) draw_circle,參數(shù)分別為鼠標事件類型、鼠標位置的 x 和 y 坐標、額外的標志和參數(shù)。
if event == cv.EVENT_LBUTTONDBLCLK:檢查鼠標事件是否為雙擊左鍵。
cv.circle(img, (x, y), 100, (255, 0, 0), -1):在圖像 img 上繪制一個藍色的圓形,圓心為 (x, y),半徑為 100,顏色為藍色 (255, 0, 0),填充模式 -1 表示填充圓形。
3. 創(chuàng)建一個黑色圖像,一個窗口,并綁定函數(shù)到窗口
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
img = np.zeros((512, 512, 3), np.uint8):創(chuàng)建一個 512x512 的黑色圖像,數(shù)據(jù)類型為無符號 8 位整數(shù)。
cv.namedWindow('image'):創(chuàng)建一個名為 image 的窗口。
cv.setMouseCallback('image', draw_circle):將鼠標回調(diào)函數(shù) draw_circle 綁定到窗口 image。
4. 主循環(huán)
while True:
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == 27: # 按下 ESC 鍵退出
break
cv.destroyAllWindows()
while True:進入無限循環(huán),持續(xù)顯示圖像。
cv.imshow('image', img):在窗口 image 中顯示圖像 img。
if cv.waitKey(20) & 0xFF == 27:等待 20 毫秒,如果按下 ESC 鍵(ASCII 值為 27),則退出循環(huán)。
cv.destroyAllWindows():關(guān)閉所有 OpenCV 窗口。
示例二:拖動鼠標繪制矩形和圓圈
代碼詳解
import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix, iy = -1, -1
# 鼠標回調(diào)函數(shù)
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
while True:
cv.imshow('image', img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv.destroyAllWindows()
代碼解析
1. 導(dǎo)入必要的庫
import numpy as np import cv2 as cv
import numpy as np:導(dǎo)入 NumPy 庫,并將其別名為 np,用于創(chuàng)建和操作數(shù)組。
import cv2 as cv:導(dǎo)入 OpenCV 庫,并將其別名為 cv,用于圖像處理和窗口管理。
2. 初始化變量
drawing = False # true if mouse is pressed mode = True # if True, draw rectangle. Press 'm' to toggle to curve ix, iy = -1, -1
drawing = False:布爾變量,表示鼠標是否按下。
mode = True:布爾變量,表示當前繪制模式,True 為繪制矩形,F(xiàn)alse 為繪制圓圈。
ix, iy = -1, -1:初始化鼠標按下時的坐標。
3. 定義鼠標回調(diào)函數(shù)
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)def draw_circle(event, x, y, flags, param):定義一個鼠標回調(diào)函數(shù) draw_circle,參數(shù)分別為鼠標事件類型、鼠標位置的 x 和 y 坐標、額外的標志和參數(shù)。
global ix, iy, drawing, mode:聲明全局變量。
if event == cv.EVENT_LBUTTONDOWN:檢查鼠標事件是否為左鍵按下,如果是,則設(shè)置 drawing 為 True 并記錄鼠標按下時的坐標。
elif event == cv.EVENT_MOUSEMOVE:檢查鼠標事件是否為移動,如果是且 drawing 為 True,則根據(jù)當前模式繪制矩形或圓圈。
elif event == cv.EVENT_LBUTTONUP:檢查鼠標事件是否為左鍵松開,如果是,則設(shè)置 drawing 為 False 并完成繪制。
4. 創(chuàng)建一個黑色圖像,一個窗口,并綁定函數(shù)到窗口
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle)
img = np.zeros((512, 512, 3), np.uint8):創(chuàng)建一個 512x512 的黑色圖像,數(shù)據(jù)類型為無符號 8 位整數(shù)。
cv.namedWindow('image'):創(chuàng)建一個名為 image 的窗口。
cv.setMouseCallback('image', draw_circle):將鼠標回調(diào)函數(shù) draw_circle 綁定到窗口 image。
5. 主循環(huán)
while True:
cv.imshow('image', img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv.destroyAllWindows()
while True:進入無限循環(huán),持續(xù)顯示圖像。
cv.imshow('image', img):在窗口 image 中顯示圖像 img。
k = cv.waitKey(1) & 0xFF:等待 1 毫秒,獲取按鍵值。
if k == ord('m'):如果按下 ‘m’ 鍵,則切換繪制模式。
elif k == 27:如果按下 ESC 鍵(ASCII 值為 27),則退出循環(huán)。
cv.destroyAllWindows():關(guān)閉所有 OpenCV 窗口。
總結(jié)
本文介紹了如何使用 OpenCV 實現(xiàn)鼠標事件回調(diào)功能,通過鼠標操作在圖像上繪制圓圈和矩形。通過理解這些基本概念和技術(shù),我們可以更加靈活地在圖像處理和交互式應(yīng)用程序中應(yīng)用 OpenCV。
以上就是使用OpenCV實現(xiàn)鼠標事件回調(diào)功能并繪制圖形的詳細內(nèi)容,更多關(guān)于OpenCV鼠標事件回調(diào)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實現(xiàn)對字典分別按鍵(key)和值(value)進行排序的方法分析
這篇文章主要介紹了Python實現(xiàn)對字典分別按鍵(key)和值(value)進行排序的方法,結(jié)合實例形式分析了Python基于sorted函數(shù)及operator庫進行字典排序的相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
Python中的os.path路徑模塊中的操作方法總結(jié)
os.path模塊主要集成了針對路徑文件夾的操作功能,這里我們就來看一下Python中的os.path路徑模塊中的操作方法總結(jié),需要的朋友可以參考下2016-07-07
Python 安裝第三方庫 pip install 安裝慢安裝不上的解決辦法
很多朋友反映在使用pip install安裝python 第三方庫的過程中會出現(xiàn)網(wǎng)速很慢,或者是安裝下載到中途,停止,卡主,或者是下載報錯等問題,下面小編給大家?guī)砹私鉀Q方法,一起看看吧2019-06-06
pycharm中導(dǎo)入模塊錯誤時提示Try to run this command from the system ter
這篇文章主要介紹了pycharm中導(dǎo)入模塊錯誤時提示Try to run this command from the system terminal問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Keras模型轉(zhuǎn)成tensorflow的.pb操作
這篇文章主要介紹了Keras模型轉(zhuǎn)成tensorflow的.pb操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python筆記之a(chǎn) = [0]*x格式的含義及說明
這篇文章主要介紹了Python筆記之a(chǎn) = [0]*x格式的含義及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

