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

使用?OpenCV?開發(fā)虛擬鍵盤的方法

 更新時間:2021年11月27日 09:49:39   作者:woshicver  
OpenCV是一個強大的圖像處理工具,用于機器學(xué)習(xí)、圖像處理等的跨平臺開源庫,用于開發(fā)實時計算機視覺應(yīng)用程序,本文重點給大家介紹使用?OpenCV?開發(fā)虛擬鍵盤的方法,感興趣的朋友一起看看吧

介紹

OpenCV 是最流行的計算機視覺任務(wù)庫,它是用于機器學(xué)習(xí)、圖像處理等的跨平臺開源庫,用于開發(fā)實時計算機視覺應(yīng)用程序。

CVzone 是一個計算機視覺包,它使用 OpenCV 和 Media Pipe 庫作為其核心,使我們易于運行,例如手部跟蹤、人臉檢測、面部標(biāo)志檢測、姿勢估計等,以及圖像處理和其他計算機視覺相關(guān)的應(yīng)用程序。

使用 OpenCV 實現(xiàn)虛擬鍵盤

讓我們創(chuàng)建一個虛擬鍵盤。

首先,讓我們安裝所需的模塊。

pip install numpy
 
pip install opencv-python
 
pip install cvzone
 
pip install pynput

使用 OpenCV 為虛擬鍵盤導(dǎo)入庫

現(xiàn)在讓我們導(dǎo)入所需的模塊

import cv2
import cvzone
from cvzone.HandTrackingModule import HandDetector
from time import sleep
import numpy as np
from pynput.keyboard import Controller

這里我們從 cvzone.HandTrackingModule 導(dǎo)入 HandDetector 模塊,然后為了使虛擬鍵盤工作,我們需要從 pynput.keyboard 導(dǎo)入Controller。

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(3, 1280)
cap.set(4, 720)

現(xiàn)在讓我們從 cv2.Videocapture 獲取實時輸入

detector = HandDetector(detectionCon=0.8)
keyboard_keys = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
                  ["A", "S", "D", "F", "G", "H", "J", "K", "L", ";"],
                  ["Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"]]
final_text = ""

我們以 0.8 的檢測置信度初始化 HandDetector 并將其分配給檢測器。

然后我們根據(jù)鍵盤的布局創(chuàng)建一個列表數(shù)組,并定義一個空字符串來存儲鍵入的鍵。

定義繪制函數(shù)

keyboard = Controller()
def draw(img, buttonList):
    for button in buttonList:
        x, y = button.pos
        w, h = button.size
        cvzone.cornerRect(img, (button.pos[0], button.pos[1],
                                                   button.size[0],button.size[0]), 20 ,rt=0)
        cv2.rectangle(img, button.pos, (int(x + w), int(y + h)), (255, 144, 30), cv2.FILLED)
        cv2.putText(img, button.text, (x + 20, y + 65),
                    cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
    return img

初始化鍵盤控制器,并定義一個名為draw()的函數(shù),它接受兩個參數(shù),即圖像和按鈕列表并返回圖像。在draw()函數(shù)內(nèi)部,我們使用 cvzone 的cornerRect函數(shù)在每個鍵的角落繪制矩形邊緣。這是為了讓我們的鍵盤布局看起來更好看。就像下面的圖片。

fbae7ea2f2bae2fd145638e43131a4c3.png

你也可以嘗試更改不同的顏色。

class Button():
    def __init__(self, pos, text, size=[85, 85]):
        self.pos = pos
        self.size = size
        self.text = text

然后我們定義一個名為 Button() 的類,并提供位置、文本和大小作為輸入,以便我們可以按照明確定義的順序排列鍵盤按鍵。

buttonList = []
# mybutton = Button([100, 100], "Q")
for k in range(len(keyboard_keys)):
    for x, key in enumerate(keyboard_keys[k]):
        buttonList.append(Button([100 * x + 25, 100 * k + 50], key))

上面的循環(huán)將遍歷鍵盤按鍵和 Button 對象,我們在其中給出位置和文本作為輸入附加在一個名為 button list 的列表中。稍后我們可以將這個列表傳遞給 draw 函數(shù)以在我們的實時框架之上進行繪制。

使用 OpenCV 的虛擬鍵盤主程序

重要的部分來了。

while True:
    success, img = cap.read()
    img = detector.findHands(img)
    lmList, bboxInfo = detector.findPosition(img)
    img = draw(img, buttonList)  # change the draw funtion to transparent_layout for transparent keys
    if lmList:
        for button in buttonList:
            x, y = button.pos
            w, h = button.size
 
if x < lmList[8][0]<x+w and y < lmList[8][1] < y+h:
cv2.rectangle(img, button.pos, (x + w, y + h),
(0, 255, 255), cv2.FILLED)
cv2.putText(img, button.text, (x + 20, y + 65),
cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
l, _, _ = detector.findDistance(8,12, img, draw=False)
print(l)
 
if l < 25:
keyboard.press(button.text)
cv2.rectangle(img, button.pos, (x + w, y + h),
(0, 255, 0), cv2.FILLED)
cv2.putText(img, button.text, (x + 20, y + 65),
cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
final_text += button.text
sleep(0.20)
 
cv2.rectangle(img, (25,350), (700, 450),
(255, 255, 255), cv2.FILLED)
cv2.putText(img, final_text, (60, 425),
cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
 
# cv2.rectangle(img, (100,100), (200,200),
# (100, 255, 0), cv2.FILLED)
# cv2.putText(img, 'Q', (120,180), cv2.FONT_HERSHEY_PLAIN, 5,
# (0, 0, 0), 5)
 
# img = mybutton.draw(img)
cv2.imshow("output", img)
cv2.waitKey(1)

在 while 循環(huán)中,首先我們讀取實時輸入幀并將其存儲在一個名為img的變量中。然后我們將該圖像傳遞給*檢測器.findHands()*以便在幀中找到手。然后在該圖像中,我們需要找到檢測到的手的位置和邊界框信息。

在這里我們可以找到我們的食指和中指的頂點之間的距離,如果兩者之間的距離小于某個閾值,那么我們就可以輸入我們所指示的字母。

一旦我們獲得了位置,我們就會遍歷整個位置列表。從該列表中,我們找到按鈕位置和按鈕大小,然后根據(jù)明確定義的方式將其繪制在框架上。

c1b9bd31f364e0b0f6a0e0660b1b8ead.png

圖 1:手地標(biāo)模型

之后,我們需要找到食指和中指的頂點之間的距離。在上圖中,你可以看到我們需要的最高點是點 8 和點 12。因此,我們需要在距離查找函數(shù)中傳遞 8, 12 以獲得它們之間的距離。

在上面的代碼中,你可以看到 detector.findDistance(),我們通過了 8、12 和圖像來查找距離,并將繪制標(biāo)志設(shè)置為 false,這樣我們就不需要兩點之間的任何線。

如果點之間的距離非常小,我們將使用 press() 函數(shù)來按下按鍵。在上面的代碼keyboard.press() 中,我們傳遞button.text以顯示按下的鍵。最后,我們在鍵盤布局下方繪制一個小的白色矩形框,以顯示按下的鍵。

一旦你執(zhí)行了整個代碼,它看起來像這樣。

2ef7f4bd182782f8b068dd5a67382a8c.png

將食指和中指靠近特定字母的頂部后,你可以鍵入該字母。

f59cdfe271d822da40879257161a8961.png

如果你需要更自定義的鍵盤布局,我們可以使鍵盤布局透明。我們只需要添加一個透明布局函數(shù)并將*draw()函數(shù)替換為transparent_layout()*函數(shù)即可。

讓我們定義transparent_layout()函數(shù)。下面是函數(shù)的代碼,它采用與draw()函數(shù)相同的輸入。在這里,我們將 numpy 的zero_like()函數(shù)分配給 名為imgNew的變量,并對其執(zhí)行所需的操作,例如獲得角矩形、為每個鍵創(chuàng)建矩形框并將文本放入框內(nèi)。之后,我們將該圖像復(fù)制到一個新變量并創(chuàng)建一個imgNew掩碼,然后我們使用 OpenCV 的*addWeighted()*函數(shù)將掩碼放置在實際圖像的頂部。因此,這使鍵盤布局透明。

自定義鍵盤

def transparent_layout(img, buttonList):
    imgNew = np.zeros_like(img, np.uint8)
    for button in buttonList:
        x, y = button.pos
        cvzone.cornerRect(imgNew, (button.pos[0], button.pos[1],
                                                   button.size[0],button.size[0]), 20 ,rt=0)
        cv2.rectangle(imgNew, button.pos, (x + button.size[0], y + button.size[1]),
                                   (255, 144, 30), cv2.FILLED)
        cv2.putText(imgNew, button.text, (x + 20, y + 65),
                    cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
        out = img.copy()
        alpaha = 0.5
        mask = imgNew.astype(bool)
        print(mask.shape)
        out[mask] = cv2.addWeighted(img, alpaha, imgNew, 1-alpaha, 0)[mask] 
        return out

一旦將while 循環(huán)中的*draw()函數(shù)替換為transparent_layout()*函數(shù),它將如下所示。(下圖)

ac2b894f4e35179f231a7473f9df3cce.png

使用 OpenCV 的虛擬鍵盤的完整代碼

下面是完整的代碼

import cv2
import cvzone
from cvzone.HandTrackingModule import HandDetector
from time import sleep
import numpy as np
from pynput.keyboard import Controller
 
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(3, 1280)
cap.set(4, 720)
 
detector = HandDetector(detectionCon=0.8)
keyboard_keys = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
                  ["A", "S", "D", "F", "G", "H", "J", "K", "L", ";"],
                  ["Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"]]
 
final_text = ""
 
keyboard = Controller()
 
 
def draw(img, buttonList):
    for button in buttonList:
        x, y = button.pos
        w, h = button.size
        cvzone.cornerRect(img, (button.pos[0], button.pos[1],
                                                   button.size[0],button.size[0]), 20 ,rt=0)
        cv2.rectangle(img, button.pos, (int(x + w), int(y + h)), (255, 144, 30), cv2.FILLED)
        cv2.putText(img, button.text, (x + 20, y + 65),
                    cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
    return img
 
 
def transparent_layout(img, buttonList):
    imgNew = np.zeros_like(img, np.uint8)
    for button in buttonList:
        x, y = button.pos
        cvzone.cornerRect(imgNew, (button.pos[0], button.pos[1],
                                                   button.size[0],button.size[0]), 20 ,rt=0)
        cv2.rectangle(imgNew, button.pos, (x + button.size[0], y + button.size[1]),
                                   (255, 144, 30), cv2.FILLED)
        cv2.putText(imgNew, button.text, (x + 20, y + 65),
                    cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
 
    out = img.copy()
    alpaha = 0.5
    mask = imgNew.astype(bool)
    print(mask.shape)
    out[mask] = cv2.addWeighted(img, alpaha, imgNew, 1-alpaha, 0)[mask]
    return out
 
 
class Button():
    def __init__(self, pos, text, size=[85, 85]):
        self.pos = pos
        self.size = size
        self.text = text
 
 
buttonList = []
# mybutton = Button([100, 100], "Q")
for k in range(len(keyboard_keys)):
    for x, key in enumerate(keyboard_keys[k]):
        buttonList.append(Button([100 * x + 25, 100 * k + 50], key))
 
 
while True:
    success, img = cap.read()
    img = detector.findHands(img)
    lmList, bboxInfo = detector.findPosition(img)
    img = draw(img, buttonList)  # change the draw funtion to transparent_layout for transparent keys
 
    if lmList:
        for button in buttonList:
            x, y = button.pos
            w, h = button.size
 
            if x < lmList[8][0]<x+w and y < lmList[8][1] < y+h:
                cv2.rectangle(img, button.pos, (x + w, y + h),
                              (0, 255, 255), cv2.FILLED)
                cv2.putText(img, button.text, (x + 20, y + 65),
                            cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
                l, _, _ = detector.findDistance(8,12, img, draw=False)
                print(l)
 
                if l < 25:
                    keyboard.press(button.text)
                    cv2.rectangle(img, button.pos, (x + w, y + h),
                                  (0, 255, 0), cv2.FILLED)
                    cv2.putText(img, button.text, (x + 20, y + 65),
                                cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
                    final_text += button.text
                    sleep(0.20)
 
    cv2.rectangle(img, (25,350), (700, 450),
                  (255, 255, 255), cv2.FILLED)
    cv2.putText(img, final_text, (60, 425),
                cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)
 
    # cv2.rectangle(img, (100,100), (200,200),
    #               (100, 255, 0), cv2.FILLED)
    # cv2.putText(img, 'Q', (120,180), cv2.FONT_HERSHEY_PLAIN, 5,
    #             (0, 0, 0), 5)
 
    # img = mybutton.draw(img)
    cv2.imshow("output", img)
    cv2.waitKey(1)

結(jié)論

這是虛擬鍵盤的實現(xiàn),如果你想完善它,你也可以試著添加按鍵聲音,然后我們還可以讓鍵盤布局在框架內(nèi)移動。

到此這篇關(guān)于使用 OpenCV 開發(fā)虛擬鍵盤的方法的文章就介紹到這了,更多相關(guān)OpenCV 虛擬鍵盤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Python用戶登錄接口的方法

    詳解Python用戶登錄接口的方法

    這篇文章主要介紹了Python用戶登錄接口的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Python中Yield的基本用法

    Python中Yield的基本用法

    這篇文章主要給大家介紹了關(guān)于Python中Yield的基本用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Pytorch模型微調(diào)fine-tune詳解

    Pytorch模型微調(diào)fine-tune詳解

    微調(diào)(fine-tune)通過使用在大數(shù)據(jù)上得到的預(yù)訓(xùn)練好的模型來初始化自己的模型權(quán)重,從而提升精度,這篇文章主要介紹了Pytorch模型微調(diào)(fine-tune),需要的朋友可以參考下
    2023-01-01
  • Python利用pandas和matplotlib實現(xiàn)繪制圓環(huán)圖

    Python利用pandas和matplotlib實現(xiàn)繪制圓環(huán)圖

    在可視化的過程中,圓環(huán)圖是一種常用的方式,特別適合于展示各類別占比情況,本文將介紹如何使用 Python中的 pandas 和 matplotlib 庫,來制作一個店鋪銷量占比的圓環(huán)圖,需要的可以參考下
    2023-11-11
  • python PyTorch預(yù)訓(xùn)練示例

    python PyTorch預(yù)訓(xùn)練示例

    這篇文章主要介紹了python PyTorch預(yù)訓(xùn)練示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Python2與Python3關(guān)于字符串編碼處理的差別總結(jié)

    Python2與Python3關(guān)于字符串編碼處理的差別總結(jié)

    這篇文章主要給大家介紹了Python2與Python3關(guān)于字符串編碼處理差別的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • pypy提升python項目性能使用詳解

    pypy提升python項目性能使用詳解

    這篇文章主要為大家介紹了pypy提升python項目性能使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • python的staticmethod與classmethod實現(xiàn)實例代碼

    python的staticmethod與classmethod實現(xiàn)實例代碼

    這篇文章主要介紹了python的staticmethod與classmethod實現(xiàn)實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 分享4個Python中的非常好用的自動化腳本

    分享4個Python中的非常好用的自動化腳本

    這篇文章為大家準(zhǔn)備了4個很棒的Python自動化腳本,可以解決這些問題。文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-11-11
  • Python實現(xiàn)i人事自動打卡的示例代碼

    Python實現(xiàn)i人事自動打卡的示例代碼

    這篇文章主要介紹了Python實現(xiàn)i人事自動打卡的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

叶城县| 谢通门县| 新津县| 郎溪县| 桃江县| 洞口县| 泰安市| 阜阳市| 敦化市| 绩溪县| 曲周县| 剑川县| 新乡市| 土默特右旗| 西乡县| 廉江市| 磐安县| 天水市| 三台县| 通河县| 石棉县| 靖江市| 策勒县| 梅州市| 南和县| 神木县| 长治县| 房产| 贵溪市| 化德县| 兰州市| 喀喇沁旗| 临高县| 油尖旺区| 平南县| 阜城县| 汶上县| 黑水县| 普兰县| 奇台县| 车致|