| 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 |
|
|
| |
| 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) |
| |
| |
| |
| vol = np.interp(length, [50, 300], [minVol, maxVol]) |
| volume.SetMasterVolumeLevel(vol, None) |
| |
| |
| 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) |
|
|