-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVolumeHandControl.py
85 lines (64 loc) · 2.32 KB
/
VolumeHandControl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import cv2 as cv
import numpy as np
import time
import math
import HandTrackingModule as htm
from ctypes import cast, POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
#############
wCam, hCam = 640, 480
#############
cap = cv.VideoCapture(0)
cap.set(3, wCam)
cap.set(4, hCam)
pTime = 0 # previous Time
detector = htm.HandDetector(detectionCon=0.7)
########################
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
# volume.GetMute()
# volume.GetMasterVolumeLevel()
volRange = volume.GetVolumeRange()
minVol = volRange[0]
maxVol = volRange[1]
vol = 0
volBar = 400
volPer = 0
########################
while True:
success, img = cap.read()
img = detector.findHands(img)
lmList = detector.findPosition(img, draw=False)
if len(lmList) != 0:
# print(lmList[4],lmList[8])
x1, y1 = lmList[4][1], lmList[4][2]
x2, y2 = lmList[8][1], lmList[8][2]
cx, cy = (x1 + x2) // 2, (y1 + y2) // 2 # To get the center of the line
cv.circle(img, (x1, y1), 15, (255, 0, 255), cv.FILLED)
cv.circle(img, (x2, y2), 15, (255, 0, 255), cv.FILLED)
cv.line(img, (x1, y1), (x2, y2), (255, 0, 255), 2)
cv.circle(img, (cx, cy), 10, (255, 0, 255), cv.FILLED)
length = math.hypot(x2 - x1, y2 - y1)
# print(length)
# Hand range 20 to 200
# Volume Range -65 to 0
vol = np.interp(length, [20, 200], [minVol, maxVol])
volBar = np.interp(length, [20, 200], [400, 150])
volPer = np.interp(length, [20, 200], [0, 100])
print(int(length), vol)
volume.SetMasterVolumeLevel(vol, None)
if length < 50:
cv.circle(img, (cx, cy), 10, (0, 255, 0), cv.FILLED)
cv.rectangle(img, (50, 150), (85, 400), (0, 255, 0), 3)
cv.rectangle(img, (50, int(volBar)), (85, 400), (0, 255, 0), cv.FILLED)
cv.putText(img, f'FPS: {int(volPer)} %', (40, 450), cv.FONT_HERSHEY_COMPLEX, 1, (250, 0, 0), 3)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv.putText(img, f'FPS: {int(fps)}', (40, 50), cv.FONT_HERSHEY_COMPLEX, 2, (255, 0, 0), 3)
cv.imshow("Image", img)
if cv.waitKey(1) & 0xFF == ord('q'):
break