通过OpenCV实现虚拟键盘

环境配置

在Anaconda中创建一个python=3.7的环境

可在pycharm内直接新建环境,也可以通过命令行的方式

conda create -n your_env_name python=x.x

激活或者切换虚拟环境 activate your_env_name

然后对此虚拟环境中安装额外的包

pip install cvzone

Collecting cvzoneUsing cached cvzone-1.4.1.tar.gz (11 kB)
Collecting opencv-pythonDownloading opencv_python-4.5.3.56-cp37-cp37m-win_amd64.whl (34.9 MB)|████████████████████████████████| 34.9 MB 1.1 MB/s
Collecting numpyDownloading numpy-1.21.2-cp37-cp37m-win_amd64.whl (14.0 MB)|████████████████████████████████| 14.0 MB 1.1 MB/s
Building wheels for collected packages: cvzoneBuilding wheel for cvzone (setup.py) ... doneCreated wheel for cvzone: filename=cvzone-1.4.1-py3-none-any.whl size=17681 sha256=b9f8a2d3a160b07195f96790b8a4a8aa637bbba78d9de84e60467749947f9001Stored in directory: c:\users\lzq\appdata\local\pip\cache\wheels\7d\c8\ae\0e2ab1bda96471f8c6607160b1c96f76a963d3ef846d1bb9bb
Successfully built cvzone
Installing collected packages: numpy, opencv-python, cvzone
Successfully installed cvzone-1.4.1 numpy-1.21.2 opencv-python-4.5.3.56

pip install mediapipe

Collecting absl-pyUsing cached absl_py-0.13.0-py3-none-any.whl (132 kB)
Collecting opencv-contrib-pythonDownloading opencv_contrib_python-4.5.3.56-cp37-cp37m-win_amd64.whl (41.8 MB)|████████████████████████████████| 41.8 MB 3.2 kB/s
Requirement already satisfied: numpy in f:\environment\anaconda\envs\cv37\lib\site-packages (from mediapipe) (1.21.2)
Collecting sixUsing cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Requirement already satisfied: wheel in f:\environment\anaconda\envs\cv37\lib\site-packages (from mediapipe) (0.37.0)
Collecting protobuf>=3.11.4Downloading protobuf-3.17.3-cp37-cp37m-win_amd64.whl (909 kB)|████████████████████████████████| 909 kB 3.3 MB/s
Collecting attrs>=19.1.0Downloading attrs-21.2.0-py2.py3-none-any.whl (53 kB)|████████████████████████████████| 53 kB 943 kB/s
Collecting matplotlibDownloading matplotlib-3.4.3-cp37-cp37m-win_amd64.whl (7.2 MB)|████████████████████████████████| 7.2 MB 939 kB/s
Collecting kiwisolver>=1.0.1Downloading kiwisolver-1.3.1-cp37-cp37m-win_amd64.whl (51 kB)|████████████████████████████████| 51 kB 1.3 MB/s
Collecting python-dateutil>=2.7Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting pyparsing>=2.2.1Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)|████████████████████████████████| 67 kB 823 kB/s
Collecting pillow>=6.2.0Downloading Pillow-8.3.1-1-cp37-cp37m-win_amd64.whl (3.2 MB)|████████████████████████████████| 3.2 MB 1.6 MB/s
Collecting cycler>=0.10Downloading cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Installing collected packages: six, python-dateutil, pyparsing, pillow, kiwisolver, cycler, protobuf, opencv-contrib-python, matplotlib, attrs, absl-py, mediapipe
Successfully installed absl-py-0.13.0 attrs-21.2.0 cycler-0.10.0 kiwisolver-1.3.1 matplotlib-3.4.3 mediapipe-0.8.7 opencv-contrib-python-4.5.3.56 pillow-8.3.1 prot
obuf-3.17.3 pyparsing-2.4.7 python-dateutil-2.8.2 six-1.16.0

项目实现

打开摄像

导入opencv库,并创造一个VideoCapture

import cv2cap = cv2.VideoCapture(0)# 0为webcam id
#通常为默认值,但为了有足够空间放置键盘键,所以进行设置
# HD分辨率
cap.set(3, 1280)  # 设置宽度
cap.set(4, 720)  # 设定高度while True:success, img = cap.read()cv2.imshow("Image", img)cv2.waitKey(1)

运行后应该可以顺利的打开一个窗口,展现电脑摄像头拍到的画面。

(我的电脑摄像头太渣了,所以set的分辨率完全配不上)

跟踪手部

首先导入并创建手部跟踪模块

from cvzone.HandTrackingModule import HandDetector# 创建检测器 置信度调为0.8(默认0.5)
detector=HandDetector(detectionCon=0.8)

在while循环内识别标注

此时再次运行

此时已经可以识别手部,并且标注出来了。

创建按键

屏幕中的按键有它的位置,大小,颜色,文字等属性,如果每一个都自己使用cv2.rectangle()cv2.putText来填写太过麻烦,所以考虑创建一个类来容纳按键的这些属性,并由一个列表来管理这些按键

class Button():def __init__(self, pos, text, size=[42, 42]):self.pos = posself.text = textself.size = sizedef draw(self, img, color=(112, 161, 255)):x, y = self.posw, h = self.sizecv2.rectangle(img, self.pos, (x + w, y + h), color, cv2.FILLED)cv2.putText(img, self.text, (x + 13, y + 23), cv2.FONT_HERSHEY_PLAIN, 1.5, (255, 255, 255), 1)return img

键盘字符

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', ",", ".", "/"]]

绘制

buttonList = []
for i in range(len(keys)):for j, key in enumerate(keys[i]):buttonList.append(Button([50 * j + 10+ i*12, 60+50 * i], key))def AllDraw(img):for btn in buttonList:img = btn.draw(img)return img

然后将img=AllDraw(img)加入循环之中

则可出现一个键盘

检测手指

通过mediapipe获得手势信息 相关链接

通过检测8号的位置,来判断食指尖停留在哪个键上

while True:success, img = cap.read()img = cv2.flip(img, 1)img = detector.findHands(img)lmList, bboxInfo = detector.findPosition(img)img = AllDraw(img)if lmList:for button in buttonList:x, y = button.posw, h = button.sizedeviation=1if x - deviation < lmList[8][0] < x + w + deviation \and y - deviation < lmList[8][1] < y + h + deviation:img = button.draw(img, (12, 95, 255))cv2.imshow("Image", img)cv2.waitKey(1)

点击按键

手指的点击只是轻微完全,判断起来较为麻烦,干扰较多

因此可以选择其他方式来替换点击

我选择了大拇指 4号点 轻碰 5号点位置 视为一次点击

通过l,_,_=detector.findDistance(4,5,img,draw=False)判断l的长度,如l<20是视为一次点击(可以添加变色效果)

l,_,_=detector.findDistance(4,5,img,draw=False)if l<20 :img = button.draw(img, (34,126,230))

当然,也可以使用别的方式来代替点击,比如食指与中指并在一起视为点击,等(因为我的按键设置太小所以没这样判断)

其中有一个需要注意的点,就是点击过程中可能会一下触发多次

有两种方式

  • 一种是加点判断逻辑,当l<20后变为l>20视为触发一次点击(一直按着不算点击,松手才算)
  • 一种是当第一次l<20sleep0.7秒,

添加透明效果

def AllDraw(img):imgNew = np.zeros_like(img, np.uint8)for btn in buttonList:imgNew = btn.draw(imgNew)out = img.copy()alpha = 0.2mask = imgNew.astype(bool)out[mask] = cv2.addWeighted(img,alpha,imgNew,1-alpha,0)[mask]return out

通过OpenCV实现虚拟键盘相关推荐

  1. 如何使用 OpenCV 开发虚拟键盘

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 介绍 OpenCV 是最流行的计算机视觉任务库,它是用于机器学习. ...

  2. 基于Opencv的虚拟键盘(附完整代码及报告)

    用到的库:opencv.cvzone.pynput 一.从Opencv到计算机视觉领域: Opencv是传统计算机视觉库,OpenCV用C++语言编写,它具有C ++,Python,Java和MATL ...

  3. 基于激光投影技术的虚拟键盘

    今天给大家带来的开源项目是:基于激光投影技术的虚拟键盘 原文链接:https://mp.weixin.qq.com/s/shFAY6kA9EGqWNZB_Wv8PA 直接看图,看了你就明白了!(键盘运 ...

  4. 激光投影虚拟键盘的设计与实现

    激光投影虚拟键盘的设计与实现 原理和实现流程 硬件系统 效果图 部分代码 对大学期间做的一些设计的汇总之一 原理和实现流程 激光投影虚拟键盘是基于OpenCV结合一字红外激光.图像摄像头.红外滤光片组 ...

  5. iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘

    原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954 iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击 ...

  6. 手机虚拟摄像头_没键盘也能打字?三星展示最新虚拟键盘Selfie Type:是真的

    1月8日消息,三星在近日举行的2020 CES国际消费电子展上展示了虚拟键盘Selfie Type,它是一款全新的概念产品,由三星内部的创意实验室C-Lab研发,能够通过手机的前置摄像头来智能识别用户 ...

  7. 一个虚拟键盘的简单思路

    在手机上做一个类似百度输入法之类的虚拟键盘. 像这样独立apk类似的,一般是用进程间通信来传递数据,可能会被程序监听到输入的内容. 如果自己做呢? 就是在界面上写数字键盘和拼音键盘的布局,可以当点击某 ...

  8. Android实例-解决虚拟键盘遮挡问题(XE8+小米2)

    Android实例-解决虚拟键盘遮挡问题(XE8+小米2) 参考文章: (1)Android实例-解决虚拟键盘遮挡问题(XE8+小米2) (2)https://www.cnblogs.com/FKde ...

  9. Android 适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

最新文章

  1. csrf 攻击和防御
  2. 没有调查就没有发言权
  3. Eclipse helios 上编写arduino程序并进行烧录
  4. 吴恩达机器学习作业(3):逻辑回归
  5. qt4.7 mysql 6.3 版本_详解Qt 4.7编译和访问Mysql驱动
  6. oracle设置no null,Oracle 在not in中使用null的问题
  7. Netty工作笔记0035---Reactor模式图剖析
  8. Mysql 两种情况下更新字段中部分数据的方法
  9. 华为q1设置虚拟服务器,华为荣耀路由器怎么设置?华为路由器Q1的无线网络设置方法...
  10. 盘点AI江湖中,清华人的“无问西东”
  11. T1商贸宝服务器任务栏不显示,任务栏不显示了怎么办_电脑任务栏不显示的解决方法...
  12. 手把手教你用键盘开机
  13. 玉米迷宫,Meteor Shower S,单词接龙
  14. 深度增强学习射击类游戏(vizdoom)
  15. overflow溢出处理
  16. 外包公司的客户应该如何写需求文档?
  17. Filecoin 近期热点话题,官方打造长期价值护城河!
  18. 如何扩展VMware xp虚拟机磁盘
  19. 并发编程(五)python实现生产者消费者模式多线程爬虫
  20. 【三维目标检测】VoxelNet(一):crop.py详解

热门文章

  1. 嵌入式睡眠监控报警仪的研究及设计
  2. xtend怎么使用_Java替代Xtend又推出了另一个块摇摆更新
  3. linux生成xorg,生成xorg.conf文件
  4. HC32_HC32F072FAUA_从零开始搭建空工程模板
  5. xiunobbs装插件
  6. rf 遍历列表_RF之关键字、变量、循环
  7. tensorflow计算flops
  8. Google hacking介绍
  9. EuroBen Benchmark安装以及测试(By Robinvane Suen)
  10. 智慧屏与普通屏幕有何区别?