python如何实现控制电脑音量
作者:阿轲爱玩Python
这篇文章主要介绍了python如何实现控制电脑音量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
python控制电脑音量
总共两个文件,放在同一个目录下,运行第二个就行,把1这个文件命名为“主函数”,第二个文件随意名。
1、
import cv2
import mediapipe as mp
import time
class handDect():
def __init__(self,model=False,maxHands=2,detectionCon=0.5,trackCon=0.5):
self.mode=model
self.maxHands=maxHands
self.dectionCon=detectionCon
self.trackCon=trackCon
self.myhand = mp.solutions.hands
self.hands = self.myhand.Hands(False)
self.mpDraw = mp.solutions.drawing_utils
def findHands(self,img,draw=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.hands.process(imgRGB)
if self.results.multi_hand_landmarks:
for hanglms in self.results.multi_hand_landmarks:
if draw:
self.mpDraw.draw_landmarks(img, hanglms, self.myhand.HAND_CONNECTIONS)
return img
def findPosition(self, img, handNo=0, draw=True):
lmList = []
if self.results.multi_hand_landmarks:
if self.results.multi_hand_landmarks[handNo]:
myHand = self.results.multi_hand_landmarks[handNo]
for id, lm in enumerate(myHand.landmark):
# print(id, lm)
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
# print(id, cx, cy)
lmList.append([id, cx, cy])
# if draw:
#cv2.putText(img, str(int(id)), (cx,cy), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
return lmList
def main():
pTime = 0
cTime = 0
cap = cv2.VideoCapture(0)
detector=handDect()
while True:
success, img = cap.read()
img=detector.findHands(img)
lmList = detector.findPosition(img)
if len(lmList) != 0:
mm=abs(lmList[4][1] - lmList[8][1])
kk=abs(lmList[8][2] - lmList[12][2])
if(mm<6 and kk>50):
nn="hello,word "
cv2.putText(img, str(nn), (60, 80), cv2.FONT_HERSHEY_PLAIN, 3, (60, 60, 255), 3)
# import win32com.client
#
# speaker = win32com.client.Dispatch("SAPI.SpVoice")
#
# speaker.Speak("你好, 许轲,你今天看起来郑帅")
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
cv2.imshow("image", img)
cv2.waitKey(1)
if __name__=="__main__":
main()2、
```python
import cv2
import mediapipe as mp
import time
from ctypes import cast, POINTER
import numpy as np
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
import 主函数 as htm
import math
pTime=0
cTime=0
cap=cv2.VideoCapture(0)
detector=htm.handDect()
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
volume.GetMute()
volume.GetMasterVolumeLevel()
volRange = volume.GetVolumeRange()
print(volRange)
minVol = volRange[0]
maxVol = volRange[1]
vol = 0
volBar = 400
volPer = 0
while True:
success,img=cap.read()
img=detector.findHands(img)
lmlist=detector.findPosition(img,draw=False)
if len(lmlist) != 0:
x1,y1=lmlist[4][1],lmlist[4][2]
x2, y2 = lmlist[8][1], lmlist[8][2]
cv2.circle(img,(x1,y1),10,(255,0,255),cv2.FILLED)
cv2.circle(img, (x2, y2), 10, (255, 0, 255), cv2.FILLED)
cx=int((x1+x2)/2)
cy = int((y1 + y2) / 2)
length=math.hypot(x2-x1,y2-y1)
print(length)
vol=np.interp(length,[0,200],[minVol,maxVol])
volBar = np.interp(length, [50, 300], [400, 150])
volPer = np.interp(length, [50, 300], [0, 100])
volume.SetMasterVolumeLevel(vol, None)
cv2.rectangle(img, (50, 150), (85, 400), (0, 255, 0), 3)
cv2.rectangle(img, (50, int(volBar)), (85, 400), (0, 255, 0), cv2.FILLED)
if(length<10):
cv2.circle(img, (cx, cy), 10, (0, 255, 0), cv2.FILLED)
else:
cv2.circle(img, (cx, cy), 10, (255, 0, 255), cv2.FILLED)
cv2.line(img,(x1,y1),(x2,y2),(255,0,255),3)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
cv2.putText(img, str("music"+str(int(volPer))), (170, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
cv2.imshow("image", img)
cv2.waitKey(1)手势控制电脑音量
在tiktok看到的计算机视觉大佬恩培,然后跟着一起完成了这个简单的计算机视觉的小项目。
"""
Date: 2021-11-16
功能:手势操作电脑音量
1、使用OpenCV读取摄像头视频流;
2、识别手掌关键点像素坐标;
3、根据拇指和食指指尖的坐标,利用勾股定理计算距离;
4、将距离等比例转为音量大小,控制电脑音量
"""
# 导入OpenCV
import cv2
# 导入mediapipe
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:
def __init__(self):
# 初始化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()
# 主函数
def recognize(self):
# 计算刷新率
fpsTime = time.time()
# OpenCV读取视频流
cap = cv2.VideoCapture(0)
# 视频分辨率
resize_w = 640
resize_h = 480
# 画面显示初始化参数
rect_height = 0
rect_percent_text = 0
with self.mp_hands.Hands(min_detection_confidence=0.7,
min_tracking_confidence=0.5,
max_num_hands=2) as hands:
while cap.isOpened():
success, image = cap.read()
image = cv2.resize(image, (resize_w, resize_h))
if not success:
print("空帧.")
continue
# 提高性能
image.flags.writeable = False
# 转为RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 镜像
image = cv2.flip(image, 1)
# mediapipe模型处理
results = hands.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# 判断是否有手掌
if results.multi_hand_landmarks:
# 遍历每个手掌
for hand_landmarks in results.multi_hand_landmarks:
# 在画面标注手指
self.mp_drawing.draw_landmarks(
image,
hand_landmarks,
self.mp_hands.HAND_CONNECTIONS,
self.mp_drawing_styles.get_default_hand_landmarks_style(),
self.mp_drawing_styles.get_default_hand_connections_style())
# 解析手指,存入各个手指坐标
landmark_list = []
for landmark_id, finger_axis in enumerate(
hand_landmarks.landmark):
landmark_list.append([
landmark_id, finger_axis.x, finger_axis.y,
finger_axis.z
])
if landmark_list:
# 获取大拇指指尖坐标
thumb_finger_tip = landmark_list[4]
thumb_finger_tip_x = math.ceil(thumb_finger_tip[1] * resize_w)
thumb_finger_tip_y = math.ceil(thumb_finger_tip[2] * resize_h)
# 获取食指指尖坐标
index_finger_tip = landmark_list[8]
index_finger_tip_x = math.ceil(index_finger_tip[1] * resize_w)
index_finger_tip_y = math.ceil(index_finger_tip[2] * resize_h)
# 中间点
finger_middle_point = (thumb_finger_tip_x + index_finger_tip_x) // 2, (
thumb_finger_tip_y + index_finger_tip_y) // 2
# print(thumb_finger_tip_x)
thumb_finger_point = (thumb_finger_tip_x, thumb_finger_tip_y)
index_finger_point = (index_finger_tip_x, index_finger_tip_y)
# 画指尖2点
image = cv2.circle(image, thumb_finger_point, 10, (255, 0, 255), -1)
image = cv2.circle(image, index_finger_point, 10, (255, 0, 255), -1)
image = cv2.circle(image, finger_middle_point, 10, (255, 0, 255), -1)
# 画2点连线
image = cv2.line(image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)
# 勾股定理计算长度
line_len = math.hypot((index_finger_tip_x - thumb_finger_tip_x),
(index_finger_tip_y - thumb_finger_tip_y))
# 获取电脑最大最小音量
min_volume = self.volume_range[0]
max_volume = self.volume_range[1]
# 将指尖长度映射到音量上
vol = np.interp(line_len, [50, 300], [min_volume, max_volume])
# 将指尖长度映射到矩形显示上
rect_height = np.interp(line_len, [50, 300], [0, 200])
rect_percent_text = np.interp(line_len, [50, 300], [0, 100])
# 设置电脑音量
self.volume.SetMasterVolumeLevel(vol, None)
# 显示矩形
cv2.putText(image, str(math.ceil(rect_percent_text)) + "%", (10, 350),
cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)
image = cv2.rectangle(image, (30, 100), (70, 300), (255, 0, 0), 3)
image = cv2.rectangle(image, (30, math.ceil(300 - rect_height)), (70, 300), (255, 0, 0), -1)
# 显示刷新率FPS
cTime = time.time()
fpsTime = cTime
cv2.putText(image, "FPS: " + str(int(fps_text)), (10, 70),
cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)
# 显示画面
cv2.imshow('MediaPipe Hands', image)
break
cap.release()
# 开始程序
control = HandControlVolume()
control.recognize()

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
