广告
返回顶部
首页 > 资讯 > 精选 >如何使用OpenCV开发虚拟键盘
  • 736
分享到

如何使用OpenCV开发虚拟键盘

2023-06-21 20:06:37 736人浏览 薄情痞子
摘要

本篇内容主要讲解“如何使用OpenCV开发虚拟键盘”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用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 cv2import cvzonefrom cvzone.HandTrackingModule import HandDetectorfrom time import sleepimport numpy as npfrom 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函数在每个键的角落绘制矩形边缘。这是为了让我们的键盘布局看起来更好看。就像下面的图片。

如何使用OpenCV开发虚拟键盘

你也可以尝试更改不同的颜色。

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.textsleep(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()*以便在帧中找到手。然后在该图像中,我们需要找到检测到的手的位置和边界框信息。

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

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

如何使用OpenCV开发虚拟键盘

图 1:手地标模型

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

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

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

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

如何使用OpenCV开发虚拟键盘

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

如何使用OpenCV开发虚拟键盘

如果你需要更自定义的键盘布局,我们可以使键盘布局透明。我们只需要添加一个透明布局函数并将*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()*函数,它将如下所示。(下图)

如何使用OpenCV开发虚拟键盘

使用 OpenCV 的虚拟键盘的完整代码

下面是完整的代码

import cv2import cvzonefrom cvzone.HandTrackingModule import HandDetectorfrom time import sleepimport numpy as npfrom 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开发虚拟键盘”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 如何使用OpenCV开发虚拟键盘

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

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

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

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

下载Word文档
猜你喜欢
  • 如何使用OpenCV开发虚拟键盘
    本篇内容主要讲解“如何使用OpenCV开发虚拟键盘”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用OpenCV开发虚拟键盘”吧!介绍OpenCV 是最流行的计算机视觉任务库,它是用于机器学...
    99+
    2023-06-21
  • 使用 OpenCV 开发虚拟键盘的方法
    目录介绍使用 OpenCV 实现虚拟键盘使用 OpenCV 为虚拟键盘导入库定义绘制函数使用 OpenCV 的虚拟键盘主程序自定义键盘使用 OpenCV 的虚拟键盘的完整代码结论介绍...
    99+
    2022-11-12
  • win7虚拟键盘如何打开
    本文小编为大家详细介绍“win7虚拟键盘如何打开”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7虚拟键盘如何打开”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。win7虚拟键盘打开方法打开电脑左下角的“开始...
    99+
    2023-07-01
  • win10虚拟键盘如何打开
    这篇“win10虚拟键盘如何打开”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10虚拟键盘如何打开”文章吧。win10...
    99+
    2023-07-01
  • 笔记本如何打开虚拟键盘
    这篇文章主要介绍了笔记本如何打开虚拟键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先点击开始,找到“运行”。点开“运行”,输入“osk”,点击确认。虚拟小键盘就出现了。...
    99+
    2023-06-28
  • Qt5.14.2使用虚拟键盘的关键代码
    目录说明关键代码处理视图推拉独立运行说明 这是关于Qt5(Qt5.1.4.2),QWidget编程使用Qt虚拟键盘(qtvirtualkeyboard)Tag: QT5,Qt,软件盘...
    99+
    2022-11-13
  • Win10下如何用虚拟键盘输入网络虚拟表情emoji表情
      emoji表情是近年来大热的一种网络虚拟表情,来源于日语,它可以说是人们日常表情的动画集合。2011年苹果发布的IOS 5集成了emoji表情,让它从此风靡世界。如今Win10也原生支   操作方法   首先,任务栏...
    99+
    2023-06-10
    Win10 虚拟键盘 emoji 网络 键盘输入 表情
  • 使用Unity怎么实现一个虚拟键盘功能
    使用Unity怎么实现一个虚拟键盘功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下using UnityEngine;using System...
    99+
    2023-06-09
  • 如何在vbscript中使用Sendkeys模拟键盘
    这篇文章将为大家详细讲解有关如何在vbscript中使用Sendkeys模拟键盘,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来...
    99+
    2023-06-08
  • 如何使用内存虚拟盘软件xmsdsk
    这篇文章主要讲解了“如何使用内存虚拟盘软件xmsdsk”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用内存虚拟盘软件xmsdsk”吧!随着时代的发展,电脑的内存越来越大,从原来的1M、...
    99+
    2023-06-09
  • 如何使用Python+OpenCV实现拖拽虚拟方块效果
    本篇内容主要讲解“如何使用Python+OpenCV实现拖拽虚拟方块效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Python+OpenCV实现拖拽虚拟方块效果”吧!一、核心流程op...
    99+
    2023-07-06
  • 停车小程序车牌键盘如何开发
    这篇文章主要介绍“停车小程序车牌键盘如何开发”,在日常操作中,相信很多人在停车小程序车牌键盘如何开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”停车小程序车牌键盘如何开发”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-26
  • RedHat虚拟机打不开磁盘问题如何解决?
    RedHat虚拟机打不开磁盘问题,锁定文件失败,打不开磁盘“D:\Documents\Virtual Machines\Red Hat 116\Red Hat 116.vmdk”或它所依赖的某个快照磁盘...
    99+
    2022-05-18
    RedHat 磁盘
  • 如何在PHP中实现虚拟现实开发?
    随着科技的不断发展,虚拟现实技术成为了越来越多的开发者们的追求目标。而在这个领域中,PHP作为一种常用的编程语言,也可以发挥重要作用。本文将为您介绍如何在PHP中实现虚拟现实开发。一、了解虚拟现实技术首先,我们需要对虚拟现实技术有一定的了解...
    99+
    2023-05-14
    开发 虚拟现实 PHP
  • Linux虚拟机如何搭建node.js开发环境
    今天小编给大家分享一下Linux虚拟机如何搭建node.js开发环境的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2022-11-30
    linux node.js
  • 如何使用VS2022永久配置OpenCV开发环境
    这篇文章将为大家详细讲解有关如何使用VS2022永久配置OpenCV开发环境,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下载opencv访问https://opencv.org/releases/,下载...
    99+
    2023-06-29
  • android应用中程序虚拟键盘弹出遮挡登陆按钮如何解决
    本篇文章给大家分享的是有关android应用中程序虚拟键盘弹出遮挡登陆按钮如何解决,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码实现如下;private LinearLay...
    99+
    2023-05-31
    android roi
  • 如何使用PHP开发微信小程序的虚拟现实功能?
    如何使用PHP开发微信小程序的虚拟现实功能?随着科技的不断进步,虚拟现实(Virtual Reality,VR)技术被广泛应用于各个领域,其中微信小程序也不例外。虚拟现实功能的加入,可以为用户提供更加沉浸式的体验。本文将介绍如何使用PHP开...
    99+
    2023-10-26
    虚拟现实 PHP 微信小程序
  • Android 开发之Dialog中隐藏键盘的正确使用方法
    Android 开发之Dialog中隐藏键盘的正确使用方法场景:弹出一个Dialog,里面有一个EditText,用来输入内容,因为输入时,需要弹出键盘,所以当Dialog消失时,键盘要一起隐藏。现在我们做一个自定义的DialogMyDia...
    99+
    2023-05-30
    android dialog 隐藏键盘
  • Android开发中怎么使用Dialog显示与隐藏软键盘
    Android开发中怎么使用Dialog显示与隐藏软键盘?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。效果图:2.实现过程先说说最开始的实现方法:// 显示Dialogdial...
    99+
    2023-05-31
    android dialog roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作