我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用OpenCV开发虚拟键盘

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用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开发虚拟键盘”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用OpenCV开发虚拟键盘

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

下载Word文档

猜你喜欢

如何使用OpenCV开发虚拟键盘

本篇内容主要讲解“如何使用OpenCV开发虚拟键盘”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用OpenCV开发虚拟键盘”吧!介绍OpenCV 是最流行的计算机视觉任务库,它是用于机器学
2023-06-21

win10虚拟键盘如何打开

这篇“win10虚拟键盘如何打开”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10虚拟键盘如何打开”文章吧。win10
2023-07-01

win7虚拟键盘如何打开

本文小编为大家详细介绍“win7虚拟键盘如何打开”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7虚拟键盘如何打开”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。win7虚拟键盘打开方法1、打开电脑左下角的“
2023-07-01

笔记本如何打开虚拟键盘

这篇文章主要介绍了笔记本如何打开虚拟键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.首先点击开始,找到“运行”。2.点开“运行”,输入“osk”,点击确认。3.虚拟小键
2023-06-28

Win10下如何用虚拟键盘输入网络虚拟表情emoji表情

emoji表情是近年来大热的一种网络虚拟表情,来源于日语,它可以说是编程人们日常表情的动画集合。2011年苹果发布的IOS 5集成了emoji表情,让它从此风靡世界。如今Win10也原生支js持输http://www.cppcns.com入
2023-06-10

如何在vbscript中使用Sendkeys模拟键盘

这篇文章将为大家详细讲解有关如何在vbscript中使用Sendkeys模拟键盘,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来
2023-06-08

如何使用内存虚拟盘软件xmsdsk

这篇文章主要讲解了“如何使用内存虚拟盘软件xmsdsk”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用内存虚拟盘软件xmsdsk”吧!随着时代的发展,电脑的内存越来越大,从原来的1M、
2023-06-09

使用Unity怎么实现一个虚拟键盘功能

使用Unity怎么实现一个虚拟键盘功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下using UnityEngine;using System.Collectio
2023-06-09

如何使用Python+OpenCV实现拖拽虚拟方块效果

本篇内容主要讲解“如何使用Python+OpenCV实现拖拽虚拟方块效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Python+OpenCV实现拖拽虚拟方块效果”吧!一、核心流程1、
2023-07-06

如何在虚拟机中使用软盘驱动器

要在虚拟机中使用软盘驱动器,您需要确保虚拟机中已经安装了软盘驱动器并正确配置了虚拟机的设置。以下是一些步骤来在虚拟机中使用软盘驱动器:打开虚拟机管理软件,并选择要编辑的虚拟机。进入虚拟机的设置或配置选项。在硬件设置中添加软盘驱动器,并选
如何在虚拟机中使用软盘驱动器
2024-06-11

如何在虚拟机中使用光盘驱动器

在虚拟机中使用光盘驱动器通常有两种方法:使用虚拟机软件自带的功能许多虚拟机软件如VMware和VirtualBox都支持在虚拟机中挂载光盘驱动器。您可以通过虚拟机软件的设置界面选择要挂载的光盘镜像文件或物理光盘,并将其连接到虚拟机。一旦连
如何在虚拟机中使用光盘驱动器
2024-06-11

如何使用VS2022永久配置OpenCV开发环境

这篇文章将为大家详细讲解有关如何使用VS2022永久配置OpenCV开发环境,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下载opencv访问https://opencv.org/releases/,下载
2023-06-29

虚拟主机如何使用

虚拟主机是一种在单台物理服务器上运行多个独立的网站的技术。下面是使用虚拟主机的一般步骤:1. 购买虚拟主机:在网上选择一个虚拟主机提供商,并购买适合自己需求的虚拟主机服务计划。2. 注册域名:在虚拟主机提供商的网站上注册一个域名。3. 配置
2023-08-31

python虚拟机如何使用

这篇文章主要介绍了python虚拟机如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python虚拟机如何使用文章都会有所收获,下面我们一起来看看吧。python 字节码设计一条 python 字节码主要
2023-07-06

如何使用PHP开发微信小程序的虚拟现实功能?

如何使用PHP开发微信小程序的虚拟现实功能?随着科技的不断进步,虚拟现实(Virtual Reality,VR)技术被广泛应用于各个领域,其中微信小程序也不例外。虚拟现实功能的加入,可以为用户提供更加沉浸式的体验。本文将介绍如何使用PHP开
2023-10-26

停车小程序车牌键盘如何开发

这篇文章主要介绍“停车小程序车牌键盘如何开发”,在日常操作中,相信很多人在停车小程序车牌键盘如何开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”停车小程序车牌键盘如何开发”的疑惑有所帮助!接下来,请跟着小编
2023-06-26

RedHat虚拟机打不开磁盘问题如何解决?

RedHat虚拟机打不开磁盘问题,锁定文件失败,打不开磁盘“D:\Documents\Virtual Machines\Red Hat 116\Red Hat 116.vmdk”或它所依赖的某个快照磁盘。模块&ldq
2022-05-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录