Вы когда-нибудь хотели, чтобы вы могли управлять громкостью вашего компьютера, не используя клавиатуру или мышь? С помощью этого кода Python вы можете сделать именно это — управлять громкостью вашего компьютера с помощью жестов рук!
Чтобы создать эту систему управления громкостью, мы будем использовать Python, OpenCV (для обнаружения рук) и библиотеку pycaw
(для управления звуком). Начнем с импорта необходимых библиотек
Модуль отслеживания рук:
import cv2 import mediapipe as mp import time # class class handdetector: def __init__(self,mode=False,maxHands=2,modelComplexity=1,detectionConf=0.7,trackingConf=0.5): self.mode = mode self.maxHands = maxHands self.modelComplexity = modelComplexity self.detectionConf = detectionConf self.trackingConf = trackingConf # detecting landmarks and connections self.mpHands = mp.solutions.hands self.hands = self.mpHands.Hands(self.mode,self.maxHands,self.modelComplexity,self.detectionConf,self.trackingConf) self.mpdraw = mp.solutions.drawing_utils #-------------findhands---------------- def findhands(self,img,draw=True): self.RGBimg = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) self.result = self.hands.process(self.RGBimg) if self.result.multi_hand_landmarks: for handlms in self.result.multi_hand_landmarks: if draw: self.mpdraw.draw_landmarks(img,handlms,self.mpHands.HAND_CONNECTIONS) return img # finding position===================== def findPosition(self, img, handNo=0, draw=True): lmlist = [] if self.result.multi_hand_landmarks: myHand = self.result.multi_hand_landmarks[handNo] for id, lm in enumerate(myHand.landmark): h, w, c = img.shape cx, cy = int(lm.x * w), int(lm.y * h) lmlist.append([id, cx, cy]) if draw: cv2.circle(img, (cx, cy), 7, (255, 0, 0), cv2.FILLED) return lmlist #-------------main-------------------------- def main(): cTime=0 pTime=0 cap = cv2.VideoCapture(0) while True: success,img = cap.read() # class object detector = handdetector() img = detector.findhands(img) position = detector.findPosition(img) if len(position)!=0: print(position) # calculating timed cTime = time.time() fps = 1/(cTime-pTime) pTime = cTime cv2.putText(img,str(int(fps)),(10,70),cv2.FONT_HERSHEY_PLAIN,1,(255,0,0),1) cv2.imshow('img',img) if cv2.waitKey(20) & 0xFF == ord('d'): break #-----------------python main--------------- if __name__=="__main__": main()
Это код Python, который использует OpenCV и модуль отслеживания рук для управления громкостью аудиовыхода компьютера, определяя расстояние между кончиками большого и указательного пальцев.
Код импортирует необходимые библиотеки: math
, cv2
, numpy
, time
, comtypes
и pycaw.pycaw
.
Затем он устанавливает размеры окна видеозахвата на 730x500
пикселей.
Затем код использует библиотеку pycaw
для доступа к устройству вывода звука компьютера и установки минимального и максимального уровня громкости.
После этого код инициализирует объект захвата видео и объект handdetector
, который является классом из модуля отслеживания рук. Объект handdetector
используется для обнаружения и отслеживания руки пользователя в видеопотоке.
Внутри цикла while код считывает кадры с объекта видеозахвата и обрабатывает их, чтобы обнаружить руку пользователя и вычислить расстояние между кончиками большого и указательного пальцев.
Если расстояние меньше 50
пикселей, код рисует желтый круг вокруг центра руки.
Затем расстояние сопоставляется с диапазоном громкости с помощью функции np.interp()
. Уровень громкости и положение шкалы громкости обновляются соответствующим образом.
Текущая частота кадров рассчитывается и отображается на экране.
Наконец, измененный кадр отображается на экране с помощью функции cv.imshow()
. Если нажата клавиша d
, цикл while прерывается и программа завершается.
import math
: импортирует модульmath
, предоставляющий математические операции и функции.import cv2 as cv
: импортирует модульcv2
и переименовывает его вcv
для упрощения использования. Этот модуль используется для задач обработки изображений и видео.import numpy as np
: импортирует модульnumpy
и переименовывает его вnp
для упрощения использования. Этот модуль используется для числовых операций и манипулирования массивами.import time
: импортирует модульtime
, который предоставляет функции, связанные со временем.from comtypes import CLSCTX_ALL
: импортирует константуCLSCTX_ALL
из модуляcomtypes
, которая используется для специфичных для Windows функций.from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
: импортирует классыAudioUtilities
иIAudioEndpointVolume
из модуляpycaw.pycaw
, который используется для задач, связанных со звуком.from HandTrackinngModul import handdetector
: импортирует классhanddetector
из модуля с именемHandTrackinngModul
, который содержит код для отслеживания рук.
capW,capH = 730,500
Эта строка устанавливает для переменных capW
и capH
значения 730
и 500
соответственно, которые представляют ширину и высоту окна захвата видео.
devices = AudioUtilities.GetSpeakers() interface = devices.Activate( IAudioEndpointVolume._iid_, CLSCTX_ALL, None) volume = interface.QueryInterface(IAudioEndpointVolume) volume.GetMasterVolumeLevel() volRange = volume.GetVolumeRange() volume.SetMasterVolumeLevel(0, None) minrange = volRange[0] maxrange = volRange[1]
Эти строки используют библиотеку pycaw
для доступа к устройству вывода звука компьютера и установки минимального и максимального уровня громкости.
Во-первых, функция AudioUtilities.GetSpeakers()
используется для получения ссылки на устройство вывода звука компьютера.
Затем вызывается метод devices.Activate()
для активации интерфейса громкости конечной точки аудио и возврата экземпляра интерфейса IAudioEndpointVolume
.
Переменная volume
устанавливается для этого экземпляра интерфейса IAudioEndpointVolume
.
Затем вызывается метод volume.GetMasterVolumeLevel()
для получения текущего уровня громкости.
Метод volume.GetVolumeRange()
используется для получения минимального и максимального уровня громкости.
Наконец, минимальный и максимальный уровни громкости назначаются переменным minrange
и maxrange
соответственно.
cap = cv.VideoCapture(0) cap.set(3,capW) cap.set(4,capH) cTime = 0 pTime = 0 vol=0 volbar=450
Эти строки инициализируют объект захвата видео cap
с помощью функции cv.VideoCapture()
, которая устанавливает в качестве источника видео камеру по умолчанию (представленную 0
).
Ширина и высота окна захвата видео устанавливаются равными capW
и capH
соответственно с помощью метода cap.set()
.
cTime
и pTime
установлены на 0
, а vol
и volbar
инициализированы на 0
и 450
соответственно.
detector = handdetector()
Эта строка создает экземпляр класса handdetector
из модуля HandTrackinngModul
и присваивает его переменной detector
.
while True: success,frame = cap.read() frame
if length < 50:
: проверьте, меньше ли длина между большим и указательным пальцами 50 (пикселей).cv.circle(frame, (cx, cy), 15, (0, 255, 255), cv.FILLED)
: нарисуйте желтый круг в центре двух пальцев, если они достаточно близко.
Следующие несколько строк кода вычисляют громкость, которую необходимо установить, исходя из расстояния между большим и указательным пальцами, а затем устанавливают громкость с помощью библиотеки pycaw.
vol = np.interp(length,[50,210],[minrange,maxrange])
: рассчитать громкость, которую необходимо установить, исходя из расстояния между большим и указательным пальцами. При этом используется функцияnp.interp
из numpy для сопоставления значения длины из диапазона [50,210] с диапазоном [minrange, maxrange].volbar = np.interp(length,[50,210],[450,150])
: вычислите высоту зеленого прямоугольника, который представляет объем на экране, используя ту же функциюnp.interp
.volper = np.interp(length,[50,210],[0,100])
: рассчитать процент максимальной громкости на основе расстояния между большим и указательным пальцами.volume.SetMasterVolumeLevel(vol, None)
: установите объем на расчетное значение с помощью функцииSetMasterVolumeLevel
из библиотеки pycaw.
Следующие строки кода создают полосу громкости на экране:
cv.rectangle(frame,(20,150),(50,450),(255,0,0),3)
: нарисуйте красный прямоугольник, представляющий максимальную громкость на экране.cv.rectangle(frame,(20,int(volbar)),(50,450),(0,255,0),3,cv.FILLED)
: нарисуйте зеленый прямоугольник, представляющий текущий уровень громкости на экране. Высота прямоугольника определяется вычисленной ранее переменнойvolbar
.cv.putText(frame, f"FPS: {int(volbar)}", (15, 450), cv.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 3)
: напишите текущее значение кадра в секунду (FPS) на экране сразу под полосой громкости.
Наконец, код отображает выходное изображение на экране и ждет, пока пользователь нажмет клавишу «d», чтобы выйти из цикла:
cv.imshow('img',frame)
: отображение выходного изображения на экране.if cv.waitKey(20) & 0xFF==ord('d'):
: ждать нажатия клавиши в течение 20 миллисекунд и выйти из цикла, если нажата клавиша «d».