Download VolumeControl.py from WalidAlHassan/Virtual-Control: direct link, hf CLI and curl.
- Browser
- Download file 2.62 kB
-
https://huggingface.co/WalidAlHassan/Virtual-Control/resolve/main/VolumeControl.py
- Command line
-
hf download hf://WalidAlHassan/Virtual-Control/VolumeControl.py
-
curl -L -o VolumeControl.py https://huggingface.co/WalidAlHassan/Virtual-Control/resolve/main/VolumeControl.py
2.62 kB
| 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) | |