Вы когда-нибудь хотели, чтобы вы могли управлять громкостью вашего компьютера, не используя клавиатуру или мышь? С помощью этого кода 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 прерывается и программа завершается.

  1. import math: импортирует модуль math, предоставляющий математические операции и функции.
  2. import cv2 as cv: импортирует модуль cv2 и переименовывает его в cv для упрощения использования. Этот модуль используется для задач обработки изображений и видео.
  3. import numpy as np: импортирует модуль numpy и переименовывает его в np для упрощения использования. Этот модуль используется для числовых операций и манипулирования массивами.
  4. import time: импортирует модуль time, который предоставляет функции, связанные со временем.
  5. from comtypes import CLSCTX_ALL: импортирует константу CLSCTX_ALL из модуля comtypes, которая используется для специфичных для Windows функций.
  6. from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume: импортирует классы AudioUtilities и IAudioEndpointVolume из модуля pycaw.pycaw, который используется для задач, связанных со звуком.
  7. 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».