国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

這篇具有很好參考價(jià)值的文章主要介紹了計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

第一節(jié)、鍵盤響應(yīng)操作

鍵盤響應(yīng)中有一個(gè)函數(shù)叫做waitKey,所有的獲取鍵盤鍵值都是通過waitKey函數(shù)實(shí)現(xiàn)的。

1.鍵盤響應(yīng)事件


  • cv.waitKey( [, delay] ) --> retval
  • delay如果沒有聲明或者delay=0,表示一直阻塞
  • delay大于0,表示阻塞指定毫秒數(shù)
  • retval返回的對應(yīng)鍵盤鍵值,注意:在不同的操作系統(tǒng)中可能會有差異!
  • 典型的retval = 27是ESC按鍵(windows環(huán)境下)

用戶通過敲擊鍵盤,操作系統(tǒng)會返回鍵值給各個(gè)應(yīng)用程序,當(dāng)返回鍵值給OpenCV的時(shí)候,如果我們有自己定義的接收返回值的方法,就會按照我們定義的方法對返回值進(jìn)行處理。

鍵盤屬于外部設(shè)備,由操作系統(tǒng)負(fù)責(zé)監(jiān)聽響應(yīng),當(dāng)鍵盤發(fā)出響應(yīng)被操作系統(tǒng)接收后,操作系統(tǒng)根據(jù)發(fā)出注冊的應(yīng)用程序返回接收到的鍵盤值。

2.鍵盤響應(yīng)


  • 檢查返回鍵值,根據(jù)不同鍵值完成不同操作
  • 推薦使用if-elif-else, switch-case方式python3.10支持
# 例如借助if-elif-else來處理我們需要的鍵值
if <expr>:
    <statement(s)>
elif <expr>:
    <statement(s)>
elif <expr>:
    <statement(s)>
    ...
else:
    <statement(s)>

3.代碼練習(xí)與測試


例如我們可以按照如下設(shè)定:

  • 按ESC退出程序
  • 按1顯示HSV圖像
  • 按2顯示YCrCb圖像
  • 按3顯示RGB圖像
  • 按0恢復(fù)原圖BGR顯示
def keyboard_demo():
    image = cv.imread(r"F:\python\opencv-4.x\samples\data\butterfly.jpg")
    cv.namedWindow("keyboard_demo", cv.WINDOW_AUTOSIZE)
    cv.imshow("keyboard_demo", image)
    while True:
        c = cv.waitKey(10)  # 停頓10ms
        # ESC
        if c == 27:
            break
        # key = 0
        elif c == 48:
            cv.imshow("keyboard_demo", image)
        # key = 1
        elif c == 49:
            hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
            cv.imshow("keyboard_demo", hsv)
        # key = 2
        elif c == 50:
            ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
            cv.imshow("keyboard_demo", ycrcb)
        # key = 3
        elif c == 51:
            rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)
            cv.imshow("keyboard_demo", rgb)
        else:
            if c != -1:
                print("Key: ", c, "is not define.")
    cv.waitKey(0)
    cv.destroyAllWindows()

結(jié)果示例:

從左往右依次是BGR/HSV/YCrCb/RGB:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

如果鍵入了沒有定義的鍵值就會按照else中寫的返回一個(gè)結(jié)果如下圖所示:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

第二節(jié)、鼠標(biāo)操作與響應(yīng)

1.鼠標(biāo)事件與回調(diào)


和鍵盤一樣,鼠標(biāo)屬于外部設(shè)備,由操作系統(tǒng)負(fù)責(zé)監(jiān)聽響應(yīng),當(dāng)鼠標(biāo)發(fā)出響應(yīng)被操作系統(tǒng)接收后,操作系統(tǒng)根據(jù)發(fā)出注冊的應(yīng)用程序返回接收到的鼠標(biāo)值。

注冊與回調(diào)過程非常類似滾動(dòng)條的操作。

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

鼠標(biāo)支持的事件:

  • 左鍵操作:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

  • 右鍵操作:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

  • 中鍵+滾輪操作:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

1.EVENT_LBUTTONDOWN
2.EVENT_MOUSEMOVE
3.EVENT_LBUTTONUP
# 以上是三個(gè)非常重要的鼠標(biāo)事件,這三個(gè)動(dòng)作要在一套動(dòng)作中完成
鼠標(biāo)左鍵按下、鼠標(biāo)移動(dòng)、鼠標(biāo)左鍵彈起

2.鼠標(biāo)操作


# 鼠標(biāo)回調(diào)函數(shù)
1. cv2.setMouseCallback(windowName, onMouse, param=None) 
# windowName:窗口名稱
# onMouse:鼠標(biāo)響應(yīng)函數(shù)
# param:響應(yīng)函數(shù)傳遞的的參數(shù)

# 鼠標(biāo)響應(yīng)函數(shù)
2. onMouse(event, x, y, flags, param)
# event:鼠標(biāo)事件,可用參數(shù)對應(yīng)值代替
# x:鼠標(biāo)x坐標(biāo)
# y:鼠標(biāo)y坐標(biāo)
# flags:鼠標(biāo)狀態(tài),可用參數(shù)對應(yīng)值代替
# param:param是用戶定義的傳遞到setMouseCallback函數(shù)調(diào)用的參數(shù)

3.代碼練習(xí)與測試


繪制矩形:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

  • 鼠標(biāo)繪制第一步,reset之前的繪制
  • 記錄鼠標(biāo)按下位置(EVENT_LBUTTONDOWN)
  • 記錄鼠標(biāo)移動(dòng)位置,并繪制矩形(EVENT_MOUSEMOVE)
  • 抬起,記錄位置,繪制最終矩形大小(EVENT_LBUTTONUP)

鼠標(biāo)繪制矩形:

# 鼠標(biāo)操作繪制矩形
b1 = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
img = np.copy(b1)
# (x1, y1)表示左上角,(x2, y2)表示右下角點(diǎn)
x1 = -1
x2 = -1
y1 = -1
y2 = -1


# 定義繪制矩形的注冊函數(shù)
def mouse_drawing_rectangle(event, x, y, flags, parm):
    # 全局參數(shù)
    global x1, y1, x2, y2
    # 鼠標(biāo)放下,賦值左上角點(diǎn)給x1,y1
    if event == cv.EVENT_LBUTTONDOWN:
        x1 = x
        y1 = y
    # 鼠標(biāo)移動(dòng)
    if event == cv.EVENT_MOUSEMOVE:
        # x1,y1初始值都是-1,如果移動(dòng)過程<0說明鼠標(biāo)沒有摁下
        if x1 < 0 or y1 < 0:
            return
        x2 = x
        y2 = y
        dx = x2 - x1
        dy = y2 - y1
        # 移動(dòng)有一定距離才會繪制
        if dx > 0 and dy > 0:
            # 矩形繪制到b1(讀入的圖片)上
            # img是原圖
            b1[:, :, :] = img[:, :, :]  # 用原圖覆蓋擦除之前的繪制結(jié)果
            cv.putText(b1, "searching...", (x1, y1-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2)
            cv.rectangle(b1, (x1, y1), (x2, y2), (255, 0, 255), 2, 8, 0)  # 移動(dòng)過程中用紫色線
    if event == cv.EVENT_LBUTTONUP:
        x2 = x
        y2 = y
        dx = x2 - x1
        dy = y2 - y1
        if dx > 0 and dy > 0:
            # 矩形繪制到b1(讀入的圖片)上
            # img是原圖
            b1[:, :, :] = img[:, :, :]  # 用原圖覆蓋擦除之前的繪制結(jié)果
            cv.putText(b1, "Moon", (x1, y1-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            cv.rectangle(b1, (x1, y1), (x2, y2), (0, 0, 255), 2, 8, 0)  # 鼠標(biāo)抬起之后用紅色線
        # 重新賦值為下一次繪制做準(zhǔn)備
        x1 = -1
        y1 = -1
        x2 = -1
        y2 = -1
        
def mouse_demo():
    cv.namedWindow("mouse_demo", cv.WINDOW_AUTOSIZE)
    # 實(shí)時(shí)關(guān)注mouse_demo畫布上的響應(yīng),如果發(fā)生mouse_drawing中定義的事件,就返回響應(yīng)
    cv.setMouseCallback("mouse_demo", mouse_drawing_rectangle)  # 繪制矩形
    while True:
        cv.imshow("mouse_demo", b1)  # 繪制矩形
        # 每過10ms就獲取一次鍵盤鍵值,默認(rèn)是-1,ESC鍵是27
        c = cv.waitKey(10)
        if c == 27:
            break
    cv.destroyAllWindows()

結(jié)果示例:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

鼠標(biāo)繪制圓形:

# 鼠標(biāo)操作繪制圓形
b2 = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
img2 = np.copy(b2)
# (c1, c2)表示圓心坐標(biāo),r1表示半徑
c1 = -1
c2 = -1


# 定義圓形的注冊函數(shù)
def mouse_drawing_circle(event, x, y, flags, parm):
    # 全局參數(shù)
    global c1, c2, r1
    # 鼠標(biāo)放下,賦值左上角點(diǎn)給x1,y1
    if event == cv.EVENT_LBUTTONDOWN:
        c1 = x
        c2 = y
    # 鼠標(biāo)移動(dòng)
    if event == cv.EVENT_MOUSEMOVE:
        # c1,c2初始值都是-1,如果移動(dòng)過程<0說明鼠標(biāo)沒有摁下
        if c1 < 0 or c2 < 0:
            return
        dr = int(math.sqrt(pow((x-c1), 2) + pow((y-c2), 2)))
        # 移動(dòng)有一定距離才會繪制
        if dr > 0:
            # 圓形繪制到b1(讀入的圖片)上
            # img是原圖
            b2[:, :, :] = img2[:, :, :]  # 用原圖覆蓋擦除之前的繪制結(jié)果
            cv.circle(b2, (c1, c2), dr, (255, 0, 255), 2, cv.LINE_8)  # 移動(dòng)過程中用紫色線
    if event == cv.EVENT_LBUTTONUP:
        dr = int(math.sqrt(pow((x - c1), 2) + pow((y - c2), 2)))
        if dr > 0:
            # 圓形繪制到b1(讀入的圖片)上
            # img是原圖
            b2[:, :, :] = img2[:, :, :]  # 用原圖覆蓋擦除之前的繪制結(jié)果
            cv.circle(b2, (c1, c2), dr, (0, 0, 255), 2, cv.LINE_8)  # 移動(dòng)過程中用紅色線
        # 重新賦值為下一次繪制做準(zhǔn)備
        c1 = -1
        c2 = -1
        
def mouse_demo():
    cv.namedWindow("mouse_demo", cv.WINDOW_AUTOSIZE)
    # 實(shí)時(shí)關(guān)注mouse_demo畫布上的響應(yīng),如果發(fā)生mouse_drawing中定義的事件,就返回響應(yīng)
    cv.setMouseCallback("mouse_demo", mouse_drawing_circle)  # 繪制圓形
    while True:
        cv.imshow("mouse_demo", b2)  # 繪制圓形
        # 每過10ms就獲取一次鍵盤鍵值,默認(rèn)是-1,ESC鍵是27
        c = cv.waitKey(10)
        if c == 27:
            break
    cv.destroyAllWindows()

結(jié)果示例:

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作
其他有趣的實(shí)現(xiàn)

同時(shí)還可以實(shí)現(xiàn)一些有意思的功能比如實(shí)現(xiàn)實(shí)時(shí)響應(yīng)截取以及類似qq截圖的功能的,只有截圖部分是亮的,其余部分是暗的。

下面代碼我是單獨(dú)寫在一個(gè)包里面的,如果需要的話可以把他們在上面的類中調(diào)用自己試一試也是很有趣的。

import cv2 as cv
import numpy as np


# 圖片區(qū)域顯示
def rectangle_space(img, x1, x2, y1, y2):
    # img = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
    # cv.imshow("img", img)
    # img2 = img[0:256, 256:512, 1:2]  # 第一個(gè)0:256表示高度所在位置,第二個(gè)0:256表示寬度所在位置,第三個(gè)1:2表示輸出通道數(shù)
    # cv.imshow("rectangle_space", img2)
    cv.imshow("rectangle_space", img[y1:y2, x1:x2, 0:3])

    cv.waitKey(1)


# 除了截圖部分其余均變暗
def rectangle_dark(img, x1, x2, y1, y2):
    # img = cv.imread(r"F:\python\opencv-4.x\samples\data\starry_night.jpg")
    # cv.imshow("img", img)
    # img2 = np.zeros_like(img)
    # img2[:, :, :] = (np.uint8(60), np.uint8(60), np.uint8(60))
    # img2[0:256, 256:512, :] = 0
    # result = cv.subtract(img, img2)
    # cv.imshow("result", result)
    img2 = np.zeros_like(img)
    img2[:, :, :] = (np.uint8(60), np.uint8(60), np.uint8(60))
    img2[y1:y2, x1:x2, :] = 0
    result = cv.subtract(img, img2)
    cv.imshow("mouse_demo", result)

    cv.waitKey(1000)


# 當(dāng)前程序執(zhí)行部分
if __name__ == '__main__':
    print("Hello world.")
    rectangle_dark()

結(jié)果示例:

左圖為實(shí)時(shí)截取,右圖為類似qq截圖的實(shí)現(xiàn)

計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作

學(xué)習(xí)參考

本系列所有OpenCv相關(guān)的代碼示例和內(nèi)容均來自博主學(xué)習(xí)的網(wǎng)站:opencv_course文章來源地址http://www.zghlxwxcb.cn/news/detail-486159.html

到了這里,關(guān)于計(jì)算機(jī)視覺OpenCv學(xué)習(xí)系列:第四部分、鍵盤+鼠標(biāo)響應(yīng)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包