OpenCV实现手势音量控制
前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV实现手势音量控制,欢迎大家一起前来探讨学习~
一、需要的库及功能介绍
本次实验需要使用OpenCV和mediapipe库进行手势识别,并利用手势距离控制电脑音量。
导入库:
cv2:OpenCV库,用于读取摄像头视频流和图像处理。
mediapipe:mediapipe库,用于手部关键点检测和手势识别。
ctypes和comtypes:用于与操作系统的音频接口进行交互。
pycaw:pycaw库,用于控制电脑音量。
功能:
初始化mediapipe和音量控制模块,获取音量范围。
打开摄像头,读取视频流。
对每一帧图像进行处理:
转换图像为RGB格式。
使用mediapipe检测手部关键点。
如果检测到手部关键点:
在图像中标注手指关键点和手势连线。
解析手指关键点坐标。
根据拇指和食指指尖的坐标,计算手势距离。
将手势距离转换为音量大小,并控制电脑音量。
显示处理后的图像。
循环执行前述步骤,直到手动停止程序或关闭摄像头。
注意事项:
在运行代码之前,需要安装相关库(opencv、mediapipe、pycaw)。
需要连接音频设备并使其可访问。
检测到多个手部时,只处理第一个检测到的手部。
检测到手指关键点时,将索引指为0的关键点作为拇指的指尖,索引指为1的关键点作为食指的指尖。
cv2.VideoCapture()函数参数问题
这并没有错。但在树莓派上调用时需要更改参数,改为:
cap = cv2.VideoCapture(1)
调用电脑摄像头时:
电脑在用cv2.VideoCapture(0)时,程序结束后会有报错:
[WARN:0]SourceReaderCB::~SourceReaderCB terminating async callback
需要改为:
?cv2.VideoCapture(0,cv2.CAP_DSHOW)
二、导入所需要的模块
?1 # 导入OpenCV
2 import cv2
3 # 导入mediapipe
4 import mediapipe as mp
5 # 导入电脑音量控制模块
6 from ctypes import cast, POINTER
7 from comtypes import CLSCTX_ALL
8 from pycaw.pycaw import AudioUtilities, 9 IAudioEndpointVolume
10 # 导入其他依赖包
11 import time
12 import math
13 import numpy as np
三、初始化 HandControlVolume 类
?class HandControlVolume:
def __init__(self):
"""
初始化 HandControlVolume 类的实 例
初始化 mediapipe 对象,用于手部 关键点检测和手势识别。
获取电脑音量接口,并获取音量范 围。
"""
# 初始化 medialpipe
self.mp_drawing=mp.solutions.drawing_utils
self.mp_drawing_styles=mp.solutions.drawing_styles
self.mp_hands = mp.solutions.hands
# 获取电脑音量范围
devices = AudioUtilities.GetSpeakers()
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()
- 初始化 mediapipe 对象,用于手部关键点检测和手势识别。
- 获取电脑音量接口,并获取音量范围。
四、主函数
1.计算刷新率
初始化刷新率的计算,记录当前时间作为初始时间。
使用OpenCV打开视频流,此处读取摄像头设备,默认使用设备ID为0。
设置视频流的分辨率为指定的resize_w和resize_h大小,并将图像resize为该尺寸。
在使用hands对象之前,使用with语句创建一个上下文环境,设置手部检测和追踪的相关参数,包括最小检测置信度、最小追踪置信度和最大手的数量。
进入循环,判断视频流是否打开。使用cap.read()函数从视频流中读取一帧图像,返回的success表示是否读取成功,image则是读取到的图像。
对读取到的图像进行resize,将其调整为指定的大小。如果读取失败,则打印提示信息并继续下一次循环。
文章很长
………点赞?关注哦?………
持续更新中………