OpenCV实现手势音量控制

OpenCV实现手势音量控制

编码文章call10242025-01-16 10:15:4617A+A-

前言: 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,将其调整为指定的大小。如果读取失败,则打印提示信息并继续下一次循环。

文章很长

………点赞?关注哦?………

持续更新中………


点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4