通过OpenCV实现虚拟键盘
通过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<20
时sleep
0.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实现虚拟键盘相关推荐
- 如何使用 OpenCV 开发虚拟键盘
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 介绍 OpenCV 是最流行的计算机视觉任务库,它是用于机器学习. ...
- 基于Opencv的虚拟键盘(附完整代码及报告)
用到的库:opencv.cvzone.pynput 一.从Opencv到计算机视觉领域: Opencv是传统计算机视觉库,OpenCV用C++语言编写,它具有C ++,Python,Java和MATL ...
- 基于激光投影技术的虚拟键盘
今天给大家带来的开源项目是:基于激光投影技术的虚拟键盘 原文链接:https://mp.weixin.qq.com/s/shFAY6kA9EGqWNZB_Wv8PA 直接看图,看了你就明白了!(键盘运 ...
- 激光投影虚拟键盘的设计与实现
激光投影虚拟键盘的设计与实现 原理和实现流程 硬件系统 效果图 部分代码 对大学期间做的一些设计的汇总之一 原理和实现流程 激光投影虚拟键盘是基于OpenCV结合一字红外激光.图像摄像头.红外滤光片组 ...
- iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘
原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954 iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击 ...
- 手机虚拟摄像头_没键盘也能打字?三星展示最新虚拟键盘Selfie Type:是真的
1月8日消息,三星在近日举行的2020 CES国际消费电子展上展示了虚拟键盘Selfie Type,它是一款全新的概念产品,由三星内部的创意实验室C-Lab研发,能够通过手机的前置摄像头来智能识别用户 ...
- 一个虚拟键盘的简单思路
在手机上做一个类似百度输入法之类的虚拟键盘. 像这样独立apk类似的,一般是用进程间通信来传递数据,可能会被程序监听到输入的内容. 如果自己做呢? 就是在界面上写数字键盘和拼音键盘的布局,可以当点击某 ...
- Android实例-解决虚拟键盘遮挡问题(XE8+小米2)
Android实例-解决虚拟键盘遮挡问题(XE8+小米2) 参考文章: (1)Android实例-解决虚拟键盘遮挡问题(XE8+小米2) (2)https://www.cnblogs.com/FKde ...
- Android 适配底部返回键等虚拟键盘的完美解决方案
这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...
最新文章
- csrf 攻击和防御
- 没有调查就没有发言权
- Eclipse helios 上编写arduino程序并进行烧录
- 吴恩达机器学习作业(3):逻辑回归
- qt4.7 mysql 6.3 版本_详解Qt 4.7编译和访问Mysql驱动
- oracle设置no null,Oracle 在not in中使用null的问题
- Netty工作笔记0035---Reactor模式图剖析
- Mysql 两种情况下更新字段中部分数据的方法
- 华为q1设置虚拟服务器,华为荣耀路由器怎么设置?华为路由器Q1的无线网络设置方法...
- 盘点AI江湖中,清华人的“无问西东”
- T1商贸宝服务器任务栏不显示,任务栏不显示了怎么办_电脑任务栏不显示的解决方法...
- 手把手教你用键盘开机
- 玉米迷宫,Meteor Shower S,单词接龙
- 深度增强学习射击类游戏(vizdoom)
- overflow溢出处理
- 外包公司的客户应该如何写需求文档?
- Filecoin 近期热点话题,官方打造长期价值护城河!
- 如何扩展VMware xp虚拟机磁盘
- 并发编程(五)python实现生产者消费者模式多线程爬虫
- 【三维目标检测】VoxelNet(一):crop.py详解