基于mediapipe和cvzone的虚拟键盘

这篇具有很好参考价值的文章主要介绍了基于mediapipe和cvzone的虚拟键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

         PS:一个来自印度老哥的cvzone网站的小项目,这里做源码的讲解

效果演示:

原理及流程:

代码如下: 

源码剖析:


PS:一个来自印度老哥的cvzone网站的小项目,这里做源码的讲解

效果演示:

基于mediapipe和cvzone的虚拟键盘

原理及流程:

'''
1.链接摄像头
2.识别手势
3.绘制键盘
 3.1创建键盘字母List
 3.2通过循环绘制键盘
4.根据坐标,取得返回字母
 4.1 利用lmList[8]食指之间坐标,判断选中的字母
 4.2 利用食指与中指之间的距离,确认输入的字母
 5.扩展,修改键盘背景
 6.利用pynput模拟真实键盘输入
'''

代码如下: 

import cv2
from cvzone.HandTrackingModule import HandDetector
from time import sleep
import numpy as np
import cvzone
from pynput.keyboard import Key,Controller
cap = cv2.VideoCapture(0)
cap.set(3,1280)
cap.set(4,720)
#识别手势
detector = HandDetector(detectionCon=0.8)
keyboard = Controller()
#键盘关键字
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',',','.','/']]
class Button():
    def __init__(self,pos,text,size = [50,50]):
        self.pos = pos
        self.text = text
        self.size = size

buttonList = []
finalText = ''
for j in range(len(keys)):
    for x,key in enumerate(keys[j]):
        #循环创建buttonList对象列表
        buttonList.append(Button([60*x+20,100+j*60],key))

def drawAll(img,buttonList):
    for button in buttonList:
        x, y = button.pos
        w, h = button.size
        cvzone.cornerRect(img,(x,y,w,h),20,rt = 0)
        cv2.rectangle(img, button.pos, (x + w, y + h), (255, 0, 255), cv2.FILLED)
        cv2.putText(img, button.text, (x + 10, y + 40),
                    cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 2)
    return img

while True:
    success,img = cap.read()
    #识别手势
    img = detector.findHands(img)
    lmList,bboxInfo = detector.findPosition(img)

    img = drawAll(img,buttonList )
    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, (x-5,y-5), (x + w + 5, y + h + 5), (175, 0, 175), cv2.FILLED)
                cv2.putText(img, button.text, (x + 10, y + 40),
                            cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 2)

                l,_,_ = detector.findDistance(8,12,img,draw=False)
                print('中指(12)和食指(8)之间的距离:',l)
                if l < 30:
                    keyboard.press(button.text)
                    cv2.rectangle(img, button.pos, (x + w, y + h), (0, 255, 0), cv2.FILLED)
                    cv2.putText(img, button.text, (x + 10, y + 40),
                                cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 2)
                    finalText += button.text
                    print('当前选中的是:', button.text)
                    sleep(0.2)
    cv2.rectangle(img, (20,350), (600, 400), (175, 0, 175), cv2.FILLED)
    cv2.putText(img, finalText, (20, 390),
                cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 4)
    cv2.imshow("Image",img)
    if cv2.waitKey(1)==ord('q'):
        break

源码剖析:

cap.set(3,1280) #设置摄像头窗口的宽度为1280
cap.set(4,720)  #设置摄像头窗口的高度为720
from pynput.keyboard import Key,Controller
keyboard = Controller() #获取键盘的操控对象
class Button():  #创建虚拟键盘的按钮对象,分别是位置,内容,和默认为50*50的大小
    def __init__(self,pos,text,size = [50,50]):
        self.pos = pos
        self.text = text
        self.size = size
buttonList = []
for j in range(len(keys)):
    for x,key in enumerate(keys[j]):
        buttonList.append(Button([60*x+20,100+j*60],key)) #循环创建buttonList对象列表
def drawAll(img,buttonList): #在图像上绘制所有的自定义键盘按钮
    for button in buttonList:
        x, y = button.pos
        w, h = button.size
        cvzone.cornerRect(img,(x,y,w,h),20,rt = 0) #在按钮图像的轮廓边缘进行以四个角延伸20px的绿色线条
        cv2.rectangle(img, button.pos, (x + w, y + h), (255, 0, 255), cv2.FILLED) #以红色填充键盘按钮区域
        cv2.putText(img, button.text, (x + 10, y + 40), 
                    cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 2)#将自定义的键盘的内容显示到图像上的指定位置,以FONT_HERSHEY_PLAIN字体,3的字体大小,白色颜色,2px的粗细
    return img
输出选中的信息框
cv2.rectangle(img, (20,350), (600, 400), (175, 0, 175), cv2.FILLED)  #绘制输出框
cv2.putText(img, finalText, (20, 390),
            cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 4)  #将已经录入的字符全部显示到图像帧上对应的输出框中
lmList,bboxInfo = detector.findPosition(img)  #会在识别出手部信息后在周围框上绿色的框

基于mediapipe和cvzone的虚拟键盘

 文章来源地址https://www.toymoban.com/news/detail-488260.html

到了这里,关于基于mediapipe和cvzone的虚拟键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于opencv-mediapipe的手势识别

    上一篇文章介绍了基于opencv的手势识别,如果大家运行了我的代码,会发现代码中找出手部轮廓的效果不是很理想。当时我在网上找寻解决的办法,刚好找到了mediapip库,然后我就利用opencv和mediapipe这两个库重新进行了手势识别的代码编写。效果还不错,写篇文章记录一下。

    2024年02月09日
    浏览(52)
  • mediapipe KNN 基于mediapipe和KNN的引体向上计数/深蹲计数/俯卧撑计数【mediapipe】【KNN】【BlazePose】【K邻近算法】【python】

    Mediapipe在从视频中估计人体姿势的各种应用中发挥着关键作用,例如量化体育锻炼、手语识别和全身手势控制。例如,它可以构成瑜伽、舞蹈和健身应用的基础。它还可以在增强现实中将数字内容和信息叠加在物理世界之上。 MediaPipe Pose 是一种用于高保真身体姿势跟踪的 M

    2024年02月21日
    浏览(41)
  • 基于mediapipe和opencv的手势控制电脑鼠标

    通过我的上一篇文章,可以了解到mediapipe关于手部检测的使用方法。这时我们就可以进行一些更加炫酷的操作。这篇文章我就来讲解一下如何用手势来控制电脑鼠标。 在开始之前我们要介绍一个能够操作电脑鼠标的库pyautogui,这里我简单介绍一下该库的一些函数,方便大家观

    2024年02月07日
    浏览(44)
  • 基于python+opencv+mediapipe实现手势识别详细讲解

    目录 运行环境: 一、opencv 二、meidapipe配置 三、实现手部的识别并标注 1、参数分析 1.multi_hand_landmarks  2.multi_hand_world_landmarks 3.multi_handedness 2.绘制信息点和连线 python3.9.7  opencv-python4.6.0.66  mediapipe0.8.11 运行之前先要安装opencv-python、opencv-contrib-python、mediapipe 项目可能对版本的

    2024年01月25日
    浏览(50)
  • 来自一个敲了5年代码的网络安全工程师的自述(目前薪资20K)

    本人是一名敲了5年半代码的网络安全工程师,目前在杭州工作,月薪目前是在20.6K左右,经历过两次跳槽,第一次跳槽拿到了12K的offer,第二次跳槽拿到18K的offer。一直到目前为止的20K左右。说到这里再给大家提个醒,跳槽的时候切记没拿到下家的offer千万不要想着裸辞,不然

    2024年02月12日
    浏览(50)
  • 基于mediapipe的人体33个关键点坐标(BlazePose)

    BlazePose是一种轻量化的卷积神级网络架构,适用于单人的关键点检测,在人体身上标注33个关键点,在单个中层手机CPU上的执行速度要比OpenPose在20核桌面CPU[5]上快25-75倍。 33个关键点如下图所示 导入库 导入模型 读入图像 关键点检测结果 此时会输出关键点检测结果,如下图所

    2024年02月12日
    浏览(38)
  • 基于mediapipe的动作捕捉和unity的人物模型驱动

    实习的时候做的一个虚拟动作捕捉和人物驱动的项目,里面可分析的知识还是比较多的,主要是我还没用过unity,这软件花了半个月才熟悉起来。先看一下人物驱动的效果,可能看着有些卡,第一是我开了那个屏幕录像,还有一个是加了手指部分关键点的识别,所以帧率就下

    2024年02月05日
    浏览(44)
  • 基于opencv与mediapipe的民族舞舞蹈动作识别

    需要项目的请关注、私信 Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。在这里我们要区分两个概念:图像处理和计算机视觉的区别:图像处理

    2024年02月10日
    浏览(58)
  • 基于Mediapipe的姿势识别并同步到Unity人体模型中

    如题,由于是商业项目,无法公开源码,这里主要说一下实现此功能的思路。 人体关节点识别 基于Mediapipe Unity插件进行开发,性能比较低的CPU主机,无法流畅地运行Mediapipe,这个要注意一下。 Mediapipe33个人体关节点图如下: Mediapipe关节点映射到Unity人体骨骼 这是开发此功能

    2024年02月11日
    浏览(68)
  • 基于Mediapipe的Python手势识别项目(手势识别游戏)附项目源码

    基于Mediapipe的手势识别,完成的手势识别游戏。运行效果图如下: 首先是初始的界面效果图: 游戏规则:屏幕上会出现蚊子和蜜蜂,当手蜷曲握起时,表示抓的动作。如果抓到右边移动的蚊子,则会增加分数,如果抓到右边的蜜蜂,则会出现被蛰到的声音 :) 调用Mediapip

    2024年02月11日
    浏览(109)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包