用到的库:opencv、cvzone、pynput
一、从Opencv到计算机视觉领域:
Opencv是传统计算机视觉库,OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS操作系统。
为什么说他是传统的计算机视觉库,因为随着神经网络的发展,人们开始发现卷积神经网络在图像识别方面的显著效果,卷积神经网络一时间占领了计算机视觉领域的神坛,人们一提到计算机视觉,首先想到的就是卷积神经网络。
神经网络其实早在1950年就被提出,但是因为他对数据需求大、对算力要求高、训练时间长、同期一些更加有效传统的的机器学习算法被提出等等因素而一直无人问津。
寒冬直到2000年,新世纪到来时,神经网络算法被大规模应用的各项条件已经成熟:神经网络算法被不断优化、全球数据量激增、芯片、云技术迅猛发展、而且此时的传统机器学习算法受到限制,很难再提升预测的准确性,算法、数据与算力的进步,完全释放了神经网络的潜力。当数据量够大、神经网络够复杂时,神经网络的性能会远远超出其他机器学习算法,甚至超越人类。这为预测算法的商业化应用打下了基础。
神经网络开始变得火热,而在计算机视觉领域,利用神经网络训练图像数据仍有一定难度,一直到2012年Alexnet等网络架构被提出,神经网络正式改名深度学习,计算机视觉领域才开始进入人们的视野,而这距离现在不过短短的十年时间,所以说计算机视觉是一个很年轻的领域。
计算机视觉的一些成果:
83 Most Popular Computer Vision Applications in 2022 - viso.ai
OpenCV能做什么?
1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器人
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶
百度安全验证
Cvzone:“三哥”第三方库 啥都会一点的研究生
Pynput:控制或监控鼠标和键盘的模块
现实生活中,我们大多是使用鼠标,键盘与计算机进行交互,或者是使信号等控制计算机,如果不与计算机进行物理接触,也不用红外线等信号进行控制,仅仅是通过手部某些特征的识别来控制与计算机进行交互将会是一件很有意思的事情。未来,如果说元宇宙成为可能,那么使用双手控制虚拟界面将会是不可或缺的功能之一。
具体实现流程:
- 链接摄像头
- 识别手势
- 3.绘制键盘
- 3.1创建键盘字母List
- 3.2通过循环绘制键盘
4.根据坐标,取得返回字母
5.扩展,修改键盘背景
6.利用pynput模拟真实键盘输入
三、项目存在的缺陷与不足:
项目仍存在很多劣势与不足,例如:
1、每次点击可能一次性输入多个字母
2、摄像头实时追踪对计算机性能有一定要求,可能出现轻微卡顿等情况
3、用手去追踪定位键盘按键不够灵活。
完整代码如下:
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+600,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), ((x+w)%255, 200, (y+h)%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 = cv2.flip(img, 1)
#识别手势
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
#判断:如果手指某个部位(这里是8号位处于按钮上,该按钮显示其他颜色)
if x



