感谢恩培大佬对项目进行了完整的实现,并将代码进行开源,供大家交流学习。
一、项目简介
本项目最终达到的效果为手势控制电脑音量。如图所示
项目用python实现,调用opencv,mediapipe,ctypes等库,由以下四个步骤组成:
1、使用OpenCV读取摄像头视频流
2、识别手掌关键点像素坐标
3、根据拇指和食指指尖的坐标,利用勾股定理计算距离
4、将距离等比例转为音量大小,控制电脑音量
二、运行方法
用IDE的朋友,可以下载代码,进入6.hand_control_volume.py对应目录下运行此py文件即可,注意需要USB摄像头。
用命令行的朋友,可以先进入命令行。用windows自带的Powershell或者VsCode都行。进入命令行后,运行以下指令。(需要预先安装gitbash)
git clone https://github.com/enpeizhao/CVprojects.git
cd .\CVprojects\codes\6.hand_control_volume\
以上两行指令将代码及其历史修改记录打包下载到本地,并进入了手势控制音量的文件夹下。再运行如下指令:
pip install -r .\requirements.txt
运行上述指令,将会使用pip包管理器安装依赖库。pip将会读取requirements.txt文件的内容,将所需的包,与其对应的版本,按照文件描述的内容逐个安装。在这里便是以下五个依赖。
mediapipe==0.8.9即指定安装0.8.9版本的mediapipe。若要安装某个版本号之后的,可以使用mediapipe>=x.x.x
以上两步成功运行的话,项目运行所需的环境便配置好了,接下来便可以运行。
windows用户:
python .\6.hand_control_volume.py
mac用户:
python .\6.hand_control_volume_mac.py
输入指令按回车后,代码便开始运行。
三、代码讲解
# 更多疑问,欢迎私信交流。thujiang000
import cv2 # 导入OpenCV,用于打开摄像头,获取图像,显示图像等
import mediapipe as mp # 用于手的关键点识别
# 用于音量控制
from ctypes import cast, POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
import time # 用于计时
import math # 数学计算库,此处用于计算根号
import numpy as np # 科学计算库,实现了各种矩阵运算
class HandControlVolume: # 定义一个名为HandControlVolume的类
def __init__(self):
self.mp_drawing = mp.solutions.drawing_utils # 初始化medialpipe的画图函数
self.mp_drawing_styles = mp.solutions.drawing_styles
self.mp_hands = mp.solutions.hands # 初始化手掌检测对象
devices = AudioUtilities.GetSpeakers() # 初始化windows音频控制对象
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None) # 调用系统的音频控制接口
self.volume = cast(interface, POINTER(IAudioEndpointVolume))
self.volume.SetMute(0, None) # 设置音量归零
self.volume_range = self.volume.GetVolumeRange() # 获取电脑音量范围
# 主函数,
def recognize(self):
fpsTime = time.time()# 调用time函数记下程序运行到此处的时间,秒为单位用于