import cv2 import mediapipe as mp import time from ctypes import cast, POINTER from comtypes import CLSCTX_ALL from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume import numpy as np cap = cv2.VideoCapture(0) mpHands = mp.solutions.hands hands = mpHands.Hands(False) mpDraw = mp.solutions.drawing_utils # Initialize volume control devices = AudioUtilities.GetSpeakers() interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None) volume = cast(interface, POINTER(IAudioEndpointVolume)) volRange = volume.GetVolumeRange() minVol = volRange[0] maxVol = volRange[1] pTime = 0 cTime = 0 while True: _, img = cap.read() img = cv2.flip(img, 1) imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB) if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: lmList = [] for id, lm in enumerate(handLms.landmark): h, w, c = img.shape cx, cy = int(lm.x * w), int(lm.y * h) lmList.append([id, cx, cy]) if id == 4: cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) if id == 8: cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS) if len(lmList) != 0: x1, y1 = lmList[4][1], lmList[4][2] x2, y2 = lmList[8][1], lmList[8][2] cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3) length = np.hypot(x2 - x1, y2 - y1) # Hand range 50 - 300 # Volume range -65 - 0 vol = np.interp(length, [50, 300], [minVol, maxVol]) volume.SetMasterVolumeLevel(vol, None) # Show the volume level volBar = np.interp(length, [50, 300], [400, 150]) volPer = np.interp(length, [50, 300], [0, 100]) cv2.rectangle(img, (50, 150), (85, 400), (0, 255, 0), 3) cv2.rectangle(img, (50, int(volBar)), (85, 400), (0, 255, 0), cv2.FILLED) cv2.putText(img, f'{int(volPer)} %', (40, 450), cv2.FONT_HERSHEY_PLAIN, 2, (255, 0, 0), 2) cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str(int(fps)), (10, 78), cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 0), 3) cv2.imshow("Image", img) cv2.waitKey(1)