|
|
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) |
|
|
|