最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用OpenCV實現(xiàn)鼠標事件回調功能并繪制圖形

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

概述

OpenCV 是一個強大的計算機視覺庫,廣泛應用于圖像處理和視頻分析等領域。本文將詳細介紹如何使用 OpenCV 實現(xiàn)鼠標事件回調功能,通過鼠標操作在圖像上繪制圓圈和矩形。我們將通過兩個示例程序來展示這一功能。

環(huán)境準備

確保已經安裝了 OpenCV 庫??梢允褂靡韵旅畎惭b:

pip install opencv-python

示例一:雙擊鼠標左鍵繪制圓圈

代碼詳解

import numpy as np
import cv2 as cv

# 鼠標回調函數(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. 導入必要的庫

import numpy as np
import cv2 as cv

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

import cv2 as cv:導入 OpenCV 庫,并將其別名為 cv,用于圖像處理和窗口管理。

2. 定義鼠標回調函數(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):定義一個鼠標回調函數(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ù)據類型為無符號 8 位整數(shù)。

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

cv.setMouseCallback('image', draw_circle):將鼠標回調函數(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():關閉所有 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

# 鼠標回調函數(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. 導入必要的庫

import numpy as np
import cv2 as cv

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

import cv2 as cv:導入 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. 定義鼠標回調函數(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):定義一個鼠標回調函數(shù) draw_circle,參數(shù)分別為鼠標事件類型、鼠標位置的 x 和 y 坐標、額外的標志和參數(shù)。

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

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

elif event == cv.EVENT_MOUSEMOVE:檢查鼠標事件是否為移動,如果是且 drawing 為 True,則根據當前模式繪制矩形或圓圈。

elif event == cv.EVENT_LBUTTONUP:檢查鼠標事件是否為左鍵松開,如果是,則設置 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ù)據類型為無符號 8 位整數(shù)。

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

cv.setMouseCallback('image', draw_circle):將鼠標回調函數(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():關閉所有 OpenCV 窗口。

總結

本文介紹了如何使用 OpenCV 實現(xiàn)鼠標事件回調功能,通過鼠標操作在圖像上繪制圓圈和矩形。通過理解這些基本概念和技術,我們可以更加靈活地在圖像處理和交互式應用程序中應用 OpenCV。

以上就是使用OpenCV實現(xiàn)鼠標事件回調功能并繪制圖形的詳細內容,更多關于OpenCV鼠標事件回調的資料請關注腳本之家其它相關文章!

相關文章

最新評論

伊宁县| 保康县| 井研县| 新田县| 左权县| 龙陵县| 堆龙德庆县| 东平县| 蒲城县| 三河市| 九龙城区| 三亚市| 连山| 永德县| 咸宁市| 招远市| 武义县| 鲁山县| 呈贡县| 东海县| 金塔县| 玛纳斯县| 龙陵县| 武宁县| 建德市| 乌兰县| 武宁县| 江北区| 定襄县| 柘城县| 蓝田县| 阿图什市| 连云港市| 田阳县| 资阳市| 昌图县| 山西省| 哈尔滨市| 蒲江县| 青冈县| 阿合奇县|