欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用OpenCV實(shí)現(xiàn)鼠標(biāo)事件回調(diào)功能并繪制圖形

 更新時(shí)間:2024年11月13日 09:12:39   作者:燕鵬01  
這篇文章主要為大家詳細(xì)介紹了如何使用OpenCV實(shí)現(xiàn)鼠標(biāo)事件回調(diào)功能,并通過(guò)鼠標(biāo)操作在圖像上繪制圓圈和矩形,感興趣的小伙伴可以了解下

概述

OpenCV 是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),廣泛應(yīng)用于圖像處理和視頻分析等領(lǐng)域。本文將詳細(xì)介紹如何使用 OpenCV 實(shí)現(xiàn)鼠標(biāo)事件回調(diào)功能,通過(guò)鼠標(biāo)操作在圖像上繪制圓圈和矩形。我們將通過(guò)兩個(gè)示例程序來(lái)展示這一功能。

環(huán)境準(zhǔn)備

確保已經(jīng)安裝了 OpenCV 庫(kù)??梢允褂靡韵旅畎惭b:

pip install opencv-python

示例一:雙擊鼠標(biāo)左鍵繪制圓圈

代碼詳解

import numpy as np
import cv2 as cv

# 鼠標(biāo)回調(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)建一個(gè)黑色圖像,一個(gè)窗口,并綁定函數(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)入必要的庫(kù)

import numpy as np
import cv2 as cv

import numpy as np:導(dǎo)入 NumPy 庫(kù),并將其別名為 np,用于創(chuàng)建和操作數(shù)組。

import cv2 as cv:導(dǎo)入 OpenCV 庫(kù),并將其別名為 cv,用于圖像處理和窗口管理。

2. 定義鼠標(biāo)回調(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):定義一個(gè)鼠標(biāo)回調(diào)函數(shù) draw_circle,參數(shù)分別為鼠標(biāo)事件類(lèi)型、鼠標(biāo)位置的 x 和 y 坐標(biāo)、額外的標(biāo)志和參數(shù)。

if event == cv.EVENT_LBUTTONDBLCLK:檢查鼠標(biāo)事件是否為雙擊左鍵。

cv.circle(img, (x, y), 100, (255, 0, 0), -1):在圖像 img 上繪制一個(gè)藍(lán)色的圓形,圓心為 (x, y),半徑為 100,顏色為藍(lán)色 (255, 0, 0),填充模式 -1 表示填充圓形。

3. 創(chuàng)建一個(gè)黑色圖像,一個(gè)窗口,并綁定函數(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)建一個(gè) 512x512 的黑色圖像,數(shù)據(jù)類(lèi)型為無(wú)符號(hào) 8 位整數(shù)。

cv.namedWindow('image'):創(chuàng)建一個(gè)名為 image 的窗口。

cv.setMouseCallback('image', draw_circle):將鼠標(biāo)回調(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:進(jìn)入無(wú)限循環(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 窗口。

示例二:拖動(dòng)鼠標(biāo)繪制矩形和圓圈

代碼詳解

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

# 鼠標(biāo)回調(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)入必要的庫(kù)

import numpy as np
import cv2 as cv

import numpy as np:導(dǎo)入 NumPy 庫(kù),并將其別名為 np,用于創(chuàng)建和操作數(shù)組。

import cv2 as cv:導(dǎo)入 OpenCV 庫(kù),并將其別名為 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:布爾變量,表示鼠標(biāo)是否按下。

mode = True:布爾變量,表示當(dāng)前繪制模式,True 為繪制矩形,F(xiàn)alse 為繪制圓圈。

ix, iy = -1, -1:初始化鼠標(biāo)按下時(shí)的坐標(biāo)。

3. 定義鼠標(biāo)回調(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):定義一個(gè)鼠標(biāo)回調(diào)函數(shù) draw_circle,參數(shù)分別為鼠標(biāo)事件類(lèi)型、鼠標(biāo)位置的 x 和 y 坐標(biāo)、額外的標(biāo)志和參數(shù)。

global ix, iy, drawing, mode:聲明全局變量。

if event == cv.EVENT_LBUTTONDOWN:檢查鼠標(biāo)事件是否為左鍵按下,如果是,則設(shè)置 drawing 為 True 并記錄鼠標(biāo)按下時(shí)的坐標(biāo)。

elif event == cv.EVENT_MOUSEMOVE:檢查鼠標(biāo)事件是否為移動(dòng),如果是且 drawing 為 True,則根據(jù)當(dāng)前模式繪制矩形或圓圈。

elif event == cv.EVENT_LBUTTONUP:檢查鼠標(biāo)事件是否為左鍵松開(kāi),如果是,則設(shè)置 drawing 為 False 并完成繪制。

4. 創(chuàng)建一個(gè)黑色圖像,一個(gè)窗口,并綁定函數(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)建一個(gè) 512x512 的黑色圖像,數(shù)據(jù)類(lèi)型為無(wú)符號(hào) 8 位整數(shù)。

cv.namedWindow('image'):創(chuàng)建一個(gè)名為 image 的窗口。

cv.setMouseCallback('image', draw_circle):將鼠標(biāo)回調(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:進(jìn)入無(wú)限循環(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 實(shí)現(xiàn)鼠標(biāo)事件回調(diào)功能,通過(guò)鼠標(biāo)操作在圖像上繪制圓圈和矩形。通過(guò)理解這些基本概念和技術(shù),我們可以更加靈活地在圖像處理和交互式應(yīng)用程序中應(yīng)用 OpenCV。

以上就是使用OpenCV實(shí)現(xiàn)鼠標(biāo)事件回調(diào)功能并繪制圖形的詳細(xì)內(nèi)容,更多關(guān)于OpenCV鼠標(biāo)事件回調(diào)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python中的hashlib模塊使用實(shí)例

    python中的hashlib模塊使用實(shí)例

    這篇文章主要介紹了python中的hashlib模塊使用實(shí)例,hashlib是一個(gè)提供字符串加密功能的模塊,包含MD5和SHA的算法,MD5和SHA是摘要算法,文中以實(shí)例代碼講解hashlib模塊的基本用法,需要的朋友可以參考下
    2023-08-08
  • python二分法查找實(shí)例代碼

    python二分法查找實(shí)例代碼

    二分算法是一種效率比較高的查找算法,其輸入的是一個(gè)有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否則返回NONE,下面這篇文章主要給大家介紹了關(guān)于python二分法查找的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Python實(shí)現(xiàn)對(duì)字典分別按鍵(key)和值(value)進(jìn)行排序的方法分析

    Python實(shí)現(xiàn)對(duì)字典分別按鍵(key)和值(value)進(jìn)行排序的方法分析

    這篇文章主要介紹了Python實(shí)現(xiàn)對(duì)字典分別按鍵(key)和值(value)進(jìn)行排序的方法,結(jié)合實(shí)例形式分析了Python基于sorted函數(shù)及operator庫(kù)進(jìn)行字典排序的相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • python 圖像增強(qiáng)算法實(shí)現(xiàn)詳解

    python 圖像增強(qiáng)算法實(shí)現(xiàn)詳解

    這篇文章主要介紹了python 圖像增強(qiáng)算法實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python中的os.path路徑模塊中的操作方法總結(jié)

    Python中的os.path路徑模塊中的操作方法總結(jié)

    os.path模塊主要集成了針對(duì)路徑文件夾的操作功能,這里我們就來(lái)看一下Python中的os.path路徑模塊中的操作方法總結(jié),需要的朋友可以參考下
    2016-07-07
  • Python 安裝第三方庫(kù) pip install 安裝慢安裝不上的解決辦法

    Python 安裝第三方庫(kù) pip install 安裝慢安裝不上的解決辦法

    很多朋友反映在使用pip install安裝python 第三方庫(kù)的過(guò)程中會(huì)出現(xiàn)網(wǎng)速很慢,或者是安裝下載到中途,停止,卡主,或者是下載報(bào)錯(cuò)等問(wèn)題,下面小編給大家?guī)?lái)了解決方法,一起看看吧
    2019-06-06
  • pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system terminal

    pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system ter

    這篇文章主要介紹了pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system terminal問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 深入了解Python中pop和remove的使用方法

    深入了解Python中pop和remove的使用方法

    這篇文章主要介紹了深入了解Python中pop和remove的使用方法,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Keras模型轉(zhuǎn)成tensorflow的.pb操作

    Keras模型轉(zhuǎn)成tensorflow的.pb操作

    這篇文章主要介紹了Keras模型轉(zhuǎn)成tensorflow的.pb操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python筆記之a(chǎn) = [0]*x格式的含義及說(shuō)明

    Python筆記之a(chǎn) = [0]*x格式的含義及說(shuō)明

    這篇文章主要介紹了Python筆記之a(chǎn) = [0]*x格式的含義及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論