广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用 OpenCV 开发虚拟键盘的方法
  • 179
分享到

使用 OpenCV 开发虚拟键盘的方法

2024-04-02 19:04:59 179人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍使用 OpenCV 实现虚拟键盘使用 OpenCV 为虚拟键盘导入库定义绘制函数使用 OpenCV 的虚拟键盘主程序自定义键盘使用 OpenCV 的虚拟键盘的完整代码结论介绍

介绍

OpenCV 是最流行的计算机视觉任务库,它是用于机器学习、图像处理等的跨平台开源库,用于开发实时计算机视觉应用程序。

CVzone 是一个计算机视觉包,它使用 OpenCV 和 Media Pipe 库作为其核心,使我们易于运行,例如手部跟踪、人脸检测、面部标志检测、姿势估计等,以及图像处理和其他计算机视觉相关的应用程序。

使用 OpenCV 实现虚拟键盘

让我们创建一个虚拟键盘。

首先,让我们安装所需的模块。


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

使用 OpenCV 为虚拟键盘导入库

现在让我们导入所需的模块


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

这里我们从 cvzone.HandTrackingModule 导入 HandDetector 模块,然后为了使虚拟键盘工作,我们需要从 pynput.keyboard 导入Controller。


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

现在让我们从 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 并将其分配给检测器。

然后我们根据键盘的布局创建一个列表数组,并定义一个空字符串来存储键入的键。

定义绘制函数


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()的函数,它接受两个参数,即图像和按钮列表并返回图像。在draw()函数内部,我们使用 cvzone 的cornerRect函数在每个键的角落绘制矩形边缘。这是为了让我们的键盘布局看起来更好看。就像下面的图片。

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))

上面的循环将遍历键盘按键和 Button 对象,我们在其中给出位置和文本作为输入附加在一个名为 button list 的列表中。稍后我们可以将这个列表传递给 draw 函数以在我们的实时框架之上进行绘制。

使用 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 循环中,首先我们读取实时输入帧并将其存储在一个名为img的变量中。然后我们将该图像传递给*检测器.findHands()*以便在帧中找到手。然后在该图像中,我们需要找到检测到的手的位置和边界框信息。

在这里我们可以找到我们的食指和中指的顶点之间的距离,如果两者之间的距离小于某个阈值,那么我们就可以输入我们所指示的字母。

一旦我们获得了位置,我们就会遍历整个位置列表。从该列表中,我们找到按钮位置和按钮大小,然后根据明确定义的方式将其绘制在框架上。

c1b9bd31f364e0b0f6a0e0660b1b8ead.png

图 1:手地标模型

之后,我们需要找到食指和中指的顶点之间的距离。在上图中,你可以看到我们需要的最高点是点 8 和点 12。因此,我们需要在距离查找函数中传递 8, 12 以获得它们之间的距离。

在上面的代码中,你可以看到 detector.findDistance(),我们通过了 8、12 和图像来查找距离,并将绘制标志设置为 false,这样我们就不需要两点之间的任何线。

如果点之间的距离非常小,我们将使用 press() 函数来按下按键。在上面的代码keyboard.press() 中,我们传递button.text以显示按下的键。最后,我们在键盘布局下方绘制一个小的白色矩形框,以显示按下的键。

一旦你执行了整个代码,它看起来像这样。

2ef7f4bd182782f8b068dd5a67382a8c.png

将食指和中指靠近特定字母的顶部后,你可以键入该字母。

f59cdfe271d822da40879257161a8961.png

如果你需要更自定义的键盘布局,我们可以使键盘布局透明。我们只需要添加一个透明布局函数并将*draw()函数替换为transparent_layout()*函数即可。

让我们定义transparent_layout()函数。下面是函数的代码,它采用与draw()函数相同的输入。在这里,我们将 numpy 的zero_like()函数分配给 名为imgNew的变量,并对其执行所需的操作,例如获得角矩形、为每个键创建矩形框并将文本放入框内。之后,我们将该图像复制到一个新变量并创建一个imgNew掩码,然后我们使用 OpenCV 的*addWeighted()*函数将掩码放置在实际图像的顶部。因此,这使键盘布局透明。

自定义键盘


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 循环中的*draw()函数替换为transparent_layout()*函数,它将如下所示。(下图)

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)

结论

这是虚拟键盘的实现,如果你想完善它,你也可以试着添加按键声音,然后我们还可以让键盘布局在框架内移动。

到此这篇关于使用 OpenCV 开发虚拟键盘的方法的文章就介绍到这了,更多相关OpenCV 虚拟键盘内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用 OpenCV 开发虚拟键盘的方法

本文链接: https://www.lsjlt.com/news/158588.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用 OpenCV 开发虚拟键盘的方法
    目录介绍使用 OpenCV 实现虚拟键盘使用 OpenCV 为虚拟键盘导入库定义绘制函数使用 OpenCV 的虚拟键盘主程序自定义键盘使用 OpenCV 的虚拟键盘的完整代码结论介绍...
    99+
    2022-11-12
  • 如何使用OpenCV开发虚拟键盘
    本篇内容主要讲解“如何使用OpenCV开发虚拟键盘”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用OpenCV开发虚拟键盘”吧!介绍OpenCV 是最流行的计算机视觉任务库,它是用于机器学...
    99+
    2023-06-21
  • 虚拟键盘打开win7电脑的两种方法
    电脑虚拟键盘在电脑屏幕上,可以用鼠标打字。移动鼠标可以打字。虚拟键盘和键盘是一致的。唯一不方便的是点击鼠标使用。我们可以使用虚拟键盘代替损坏的键盘,接下来我们将介绍两种开启虚拟键盘功能的方法。虚拟键盘打开win7电脑的两种方法用win7系统...
    99+
    2023-07-13
  • Qt5.14.2使用虚拟键盘的关键代码
    目录说明关键代码处理视图推拉独立运行说明 这是关于Qt5(Qt5.1.4.2),QWidget编程使用Qt虚拟键盘(qtvirtualkeyboard)Tag: QT5,Qt,软件盘...
    99+
    2022-11-13
  • 虚拟主机键盘同步的方法是什么
    虚拟主机键盘同步的方法是使用虚拟机软件或远程桌面连接软件来实现键盘输入的同步。具体方法如下:1. 虚拟机软件:如果使用虚拟机软件如V...
    99+
    2023-08-23
    虚拟主机
  • Android 开发之Dialog中隐藏键盘的正确使用方法
    Android 开发之Dialog中隐藏键盘的正确使用方法场景:弹出一个Dialog,里面有一个EditText,用来输入内容,因为输入时,需要弹出键盘,所以当Dialog消失时,键盘要一起隐藏。现在我们做一个自定义的DialogMyDia...
    99+
    2023-05-30
    android dialog 隐藏键盘
  • Android开发之完全隐藏软键盘的方法
    隐藏软键盘一直是我头痛的事情,没有找到一种真正能隐藏的方法。点击EditText的时候总是弹出软键盘。-----杯具 杯具(一): InputMethodManager i...
    99+
    2022-06-06
    方法 android开发 软键盘 Android
  • win10的屏幕键盘怎么用?win10打开屏幕键盘的方法
      w望能够帮到大家。   1、我们点击win10的“开始”菜单   2、我们选择“电脑设置”   3、在电脑设置中我们选择“轻松使用”   ...
    99+
    2023-06-09
    win10 屏幕键盘 键盘 屏幕 方法
  • android虚拟键盘弹出遮挡登陆按钮问题的解决方法
    Android虚拟键盘的弹起会遮挡住部分ui,虽然通过在清单文件中设置,可以随着虚拟键盘的弹出,布局往上推,但是面对登陆界面时,并没有太大的作用,这样就会导致用户体验不好;开发...
    99+
    2022-06-06
    登陆 方法 按钮 Android
  • Android开发中实现点击隐藏软键盘的方法
    Android开发中实现点击隐藏软键盘的方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸E...
    99+
    2023-05-31
    android roi
  • Win10电脑键盘F1-F12的使用方法
    本文小编为大家详细介绍“Win10电脑键盘F1-F12的使用方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Win10电脑键盘F1-F12的使用方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。F1:帮助键。...
    99+
    2023-06-28
  • Linux虚拟机中QEMU的使用方法
    这期内容当中小编将会给大家带来有关Linux虚拟机中QEMU的使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  说起虚拟机,大家都不陌生。需要使用虚拟机的场景也非常的多,比如有志于写操作系统的同志...
    99+
    2023-06-13
  • Windows 11 21H2 非安全发布预览版 22000.2124 更新,解决桌面虚拟键盘无法打开等问题
    6 月 29 日消息,根据微软官网的最新消息,Windows 11 21H2 的最新非安全发布预览版更新(non-security release preview update)已经发布,内部版本号为 22000.2124(KB50272...
    99+
    2023-07-12
  • Win8.1系统使用键盘快捷键浏览网页的方法
    Win8.1系统怎么使用键盘快捷键浏览网页?在Win8.1系统下,我们打开IE浏览网页时一般情况下是用鼠标的滚轮来浏览网页,也可以拖动右侧的滚动条,需要有鼠标才可以操作。那么有没有什么方法可以用键盘来网页浏...
    99+
    2022-06-04
    快捷键 浏览网页 键盘
  • 虚拟主机的使用方法是什么
    虚拟主机是一种将一台物理服务器分割成多个独立的虚拟服务器的技术,每个虚拟服务器可以拥有自己独立的操作系统、磁盘空间、带宽和其他资源。...
    99+
    2023-08-25
    虚拟主机
  • python 虚拟环境的创建与使用方法
    首先我们知道python通过pip安装,那么我们安装的所有东西都会在我们pip下的配置目录下,这会显得非常臃肿,同样也让我们部署艰难。 python虚拟环境,他是这样做的,把一些非核...
    99+
    2022-11-12
  • win10系统usb键盘无法使用的解决方案
    有许多人在使用win10操作系统时,是否遇到过usb键盘无反应的情况,还不清楚。想知道如何处理win10系统的USB键盘无法使用问题吗?今天我将与你分享解决方案~。win10系统usb键盘无法使用的解决方法:首先在桌面上找到这台电脑,鼠标右...
    99+
    2023-07-18
  • 使用vscode 开发uniapp的方法
    因为之前一直都是使用vscode开发前端项目,现在有一些小程序或者h5项目采用uniapp开发,在体验了一段时间hbuiler之后,还是觉得vscode香,以下分享我使用vscode...
    99+
    2022-11-12
  • Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法
    //去title requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏状态栏 getWindow().setFlags...
    99+
    2022-06-06
    方法 状态栏 Android
  • 沈阳虚拟主机使用的方法有哪些
    1. 注册虚拟主机账号:首先需要在虚拟主机提供商的官网上注册账号,并选择合适的虚拟主机套餐。2. 绑定域名:在购买虚拟主机后,需要将...
    99+
    2023-06-14
    沈阳虚拟主机 虚拟主机
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作