1.环境准备

本人采用jupyter notebook作为运行环境

1.1python解释器的安装

网盘链接:https://pan.baidu.com/s/1mDv5lYJbm9rJR-fUh1bE3A

提取码:phm6

1.2anaconda的安装

网盘链接:​​​​​​​https://pan.baidu.com/s/1MyHOT7hGss0SXaGeeOx8LQ

提取码:phm6

1.3jupyter的安装

打开终端输入指令

pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple

到这里环境大致已经搭建完成,只需要进入终端输入指令

jupyter notebook

就可以运行jupyter了,在那里启动,浏览器上的目录对应那里,为了方便建议建立一个文件夹作为jupyter notebook的工作目录,每次运行时在终端cd进入工作目录,然后再运行jupyter

2.相关库的准备

pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install mediapape -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install cvzone -i https://pypi.tuna.tsinghua.edu.sn/simple

3.虚拟计算器的实现

3.1算法流程

1.打开摄像头

2.创建窗口类->绘制计算器的显示窗口

计算器的按键由外边框,内部填充,以及显示的按键文本表示,具有统一的属性,因此我们可以讲这些属性提取出来构造一个按键类

3.手部检测->点击操作->实现计算功能

3.2具体代码以及代码讲解

#创造按键类
class Button:#初始化传入pos按键位置,每个矩形框的宽高,矩形框的文本数据def __init__(self, pos, width, height, value):#初始化在循环前完成self.pos = posself.width = widthself.height = heightself.value = value#绘图方法在循环后完成def draw(self, frame):#绘制计算器轮廓,img画板 起点pos 终点pos 颜色填充cv2.rectangle(frame, self.pos, (self.pos[0]+self.width, self.pos[1]+self.height), (255,255,255), cv2.FILLED)#添加边框cv2.rectangle(frame, self.pos, (self.pos[0]+self.width, self.pos[1]+self.height), (50,50,50), 3)#添加按键文本cv2.putText(frame,self.value, (self.pos[0]+30,self.pos[1]+70),cv2.FONT_HERSHEY_COMPLEX,2,(50,50,50),2)#点击后按钮绘制def checkClick(self, x, y):#传入食指尖坐标#检查食指x在哪一个按钮框内,x1<x<x1+width 控制列#检查食指y在哪一个按钮框内,y1<y<y1+heigth 控制行if self.pos[0] < x < self.pos[0] + self.width and self.pos[1] < y < self.pos[1] + self.height:#如果点击改变按钮颜色,并将文本数据绘制到数据框内cv2.rectangle(frame, self.pos, (self.pos[0]+self.width,self.pos[1]+self.height),(0,255,255),cv2.FILLED)cv2.rectangle(frame, self.pos, (self.pos[0]+self.width,self.pos[1]+self.height),(50,50,50),3)cv2.putText(frame, self.value, (self.pos[0]+30, self.pos[1]+70), cv2.FONT_HERSHEY_COMPLEX, 2, (0,0,255), 5)return Trueelse:return False
import cv2
from cvzone.HandTrackingModule import HandDetector
import mediapipe as mp
import time
import cvzone
import pandas as pd
import numpy as np
cap=cv2.VideoCapture(0)#解决宽高问题 cv2.VideoCapture().get(propId)
#3:CV_CAP_PROP_FRAME_WIDTH 视频流中帧的宽度。
#4:CV_CAP_PROP_FRAME_HEIGHT 视频流中帧的高度
cap.set(3, 1280)#设置框宽1080
cap.set(4, 720)#设置宽高720pTime = 0#设置第一帧开始处理的起始时间#手部检测,置信度为0.8 最多检测一只手
detector = HandDetector(detectionCon=0.8, maxHands = 1)#2.1创建计算器按键
#创建value列表
buttonListvalues=[['7', '8', '9', '*'],['4', '5', '6', '-'],['1', '2', '3', '+'],['0', '/', '.', '=']]buttonList = []#存放按键信息#创建4*4按键
for x in range(4):for y in range(4):xpos = x * 100 + 800 #得到四块宽为100的矩形的起点x坐标,从x=800开始ypos = y * 100 + 150 #起点y坐标 y=150#传入起点坐标及宽高button1 = Button((xpos, ypos), 100, 100, buttonListvalues[y][x])#将确定坐标的矩形框信息存入列表buttonList.append(button1)
"""
由于首先进行内部循环,绘制时是逐列绘制,绘制完成后buttonList=      {'7','4','1','0','8','5','2','/','9','6','3','.','*','-','+','='}
"""
myEquation = ''
delayCounter = 0while True:ret, frame = cap.read()#反转图像#解决镜像问题frame = cv2.flip(frame, flipCode = 1)#检测手部关键点,返回关键点的坐标和绘制后的图像hands, frame = detector.findHands(frame, flipType=False,draw=True)#绘制计算器#首先绘制结果显示部分 width=400cv2.rectangle(frame, (800,50), (800+400,70+100), (255,255,255), cv2.FILLED)cv2.rectangle(frame, (800,50),(800+400, 70+100), (50,50,50), 3)#遍历list 调用draw 绘制每个按键for button in buttonList:button.draw(frame)#检测手指点击按键if hands:#cv2.waitKey(10000)lmlist = hands[0]['lmList']#print(np.shape(lmlist))#在实际运行时,发现lmlist传入的参数有误,将lmlist的形状打印,查看其参数,进行调试#print(np.shape(lmlist[8]))#这里的lmlist中储存的有三个参数,但在findDistance()函数中需要传递的lmlist中的参数只有两个,分别为p1和p2的(x,y)坐标,这两个参数在lmList的前两个参数,因此对lmlist进行切片操作,得到(x,y)坐标lmlist[8]=lmlist[8][:2]lmlist[12]=lmlist[12][:2]#lmlist=pd.iloc(lmlist,[0,'lmList'])#获取食指和中指指尖距离并绘线#返回指尖连线长度,线条信息,绘制后的图像length, _, frame = detector.findDistance(p1=lmlist[8], p2=lmlist[12], img=frame)#print(np.shape(_))#获取食指坐标x, y=lmlist[8]#print(length)#如果指尖距离小于50,找到按下了哪个键if length < 50:#遍历所有按键#print(np.shape(buttonList))#enumrate() 将传入的列表进行处理,返回成索引一一对应其中的参数#enumerate   return iteration startfor i,button in enumerate(buttonList):#点击按键 按键颜色发生变化 返回True 延时器为0才能运行if button.checkClick(x, y) and delayCounter==0:#计算#找到点击按钮的编号 i 0-15  转化成索引[i%4][i//4]myValue=buttonListvalues[i%4][i//4]if myValue== '=':myEquation = str(eval(myEquation)) #eval 将字符串数据作为表达式返回一个数值else:myEquation+=myValue#字符串直接相加#time.sleep(0.2)#为了防止重复点击,使用一个计数器控制每次点击的间隔时长#计数器 一次点击了一个键delayCounter = 1#点击一个按钮以后delayCounter=1 20帧以后才能点击下一个if delayCounter != 0:delayCounter += 1    #延迟一帧if delayCounter > 50:   #10帧过去后才能再次点击delayCounter = 0#绘制计算表达式cv2.putText(frame, myEquation, (800+10,100+20), cv2.FONT_HERSHEY_PLAIN, 3, (50,50,50), 3) #查看FPScTime = time.time()#处理完一帧图片的时间fps = 1/(cTime-pTime)pTime = cTime #重置起始时间#在视频上显示fps信息,先转换成整数再变成字符串形式,文本显示坐标,文本字体,文本大小cv2.putText(frame, str(int(fps)),(70,50),cv2.FONT_HERSHEY_PLAIN,3,(255,0,0))cv2.imshow("image",frame)#每帧滞留时间key = cv2.waitKey(1)#清空计算框if key == ord('c'):myEquation = ''#退出if key & 0xFF==27:break#if cv2.waitKey(100) & 0xFF == ord('q'):#    break
#释放内存
cap.release()
cv2.destoryAllWindows()

3.3运行结果

笔者对于计算机视觉相关知识也只是学习阶段,如有改进想法或疑问可以互相交流,

邮箱:2806762759@qq.com

基于python opencv mediapape 实现的虚拟计算器相关推荐

  1. 基于python+OpenCV的车牌号码识别

    基于python+OpenCV的车牌号码识别 车牌识别行业已具备一定的市场规模,在电子警察.公路卡口.停车场.商业管理.汽修服务等领域已取得了部分应用.一个典型的车辆牌照识别系统一般包括以下4个部分: ...

  2. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

  3. 基于Python+OpenCV车道线检测(直道和弯道)

    基于Python+OpenCV车道线检测(直道和弯道) 基于Python+OpenCV车道线检测(直道和弯道)

  4. 【开源分享】基于Python+OpenCV+PyQt5车牌识别(GUI界面)

    亲测无错:基于Python+OpenCV+PyQt5车牌识别(GUI界面)绝对可以用的!!!!! 基于Python+OpenCV+PyQt5车牌识别(GUI界面) 参考文档

  5. 基于python+opencv的图像目标区域自动提取

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一.提取纸张中的内容 一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要 ...

  6. 基于python+openCV的中值滤波

    先直接来一个3×3的吧 def median(src_img, filter_size, channels):# 首先,定义一个大小为9的0数组# list = [[0, 0, 0, 0, 0, 0, ...

  7. 基于python+opencv+pyautogui的图像识别点击

    第一次发文没啥经验 很多都是借鉴若有侵权请告知 必更改 开源代码只供学习交流请勿用作其他用途!!! get_img()#这个函数是获取rgb格式屏幕截图,可用于截图一次识别多个元素 imgclick( ...

  8. python人脸识别opencv_基于python+OpenCV模块的人脸识别定位技术

    什么是OpenCV模块 OpenCV是一款跨平台的视觉库,可以支持的操作系统有Linux.Windows和Mac OS操作系统,并且还提供了多种语言的接口,比如Python,java,MATLAB等常 ...

  9. opencv python考勤_GitHub - liqq1228/python-opencv: 基于python opencv人脸识别的员工考勤系统...

    项目及作者说明 一个基于 Opencv.dlib 人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09/,Python 学习期间. 开源版及商业版说明 开源版 商业版 人脸录入 ...

最新文章

  1. Android接口初了解
  2. 源码资本深耕“三横九纵”科技助力网聚优秀企业
  3. Linux 命令 —— scp linux之间复制文件和目录
  4. mysql archieve_mysql的archive储存引擎
  5. MySQL 5.1.45 GA 发布
  6. 大数据时代能否保证足够的安全
  7. Linux中级之ansible概念及hoc命令行调用模式
  8. Linux的chkconfig命令详解
  9. paip.asp 项目流程及管理工具总结
  10. 现代内衣百年:性感无罪,无尺码也不是终局
  11. C++ 工厂模式(Factory 模式)简介与实现
  12. 零配置构建工具:parcel 1
  13. python 读取asc文件_Python——文件读取与写入
  14. P3398 仓鼠找sugar(LCA,树剖)
  15. 流氓软件卸不干净?这6款超强软件卸载神器专治各种流氓软件!
  16. 基于PHP的自动化办公OA系统
  17. java感谢地说说_感恩心情说说
  18. 这怎么回事?宝宝边吃母乳边用手推妈妈,宝宝的心思知多少
  19. Git 详细教程之一: Git 简介及其基本工作原理
  20. java excel复制图片_java实现图片用Excel画出来

热门文章

  1. windows c++ 串口通讯
  2. (二)Alian 的 Spring Cloud Parent(父工程)
  3. 固定资产管理手忙脚乱之库房盘点
  4. 2022年6月17日STM32——LCD液晶显示
  5. JavaScript之V字旋转小练习
  6. 诺华创血小板减少症新药纳入新版国家医保目录
  7. 财务信息化理论及应用
  8. week7_A TT的魔法猫
  9. 孙立平:四项措施重建社会基本秩序(转载)
  10. docker(11、Docker Swarm4)11、副本数量(replicated 和 global )12、Label 控制 Service 的位置 13、如何配置 Health Check