-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
004cbdb
commit 27c88ba
Showing
11 changed files
with
318 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import cv2 | ||
import time | ||
import os | ||
import HandTrackingModule as htm | ||
|
||
|
||
|
||
wCam, hCam = 640, 480 | ||
|
||
|
||
cap = cv2.VideoCapture(0) | ||
cap.set(3, wCam) | ||
cap.set(4, hCam) | ||
folderPath = "FingerImages" | ||
myList = os.listdir(folderPath) | ||
print(myList) | ||
|
||
overlayList = [] | ||
for imPath in myList: | ||
image = cv2.imread(f'{folderPath}/{imPath}') | ||
#print((f'{folderPath}/{imPath}')) | ||
overlayList.append(image) | ||
|
||
#print(len(overlayList)) | ||
|
||
pTime = 0 | ||
detector = htm.handDetector(detectionCon=0.75) | ||
|
||
tipIds = [4,8,12,16,20] | ||
|
||
while True: | ||
success, img = cap.read() | ||
img = detector.findHands(img) | ||
|
||
lmList = detector.findPosition(img, draw= False) | ||
|
||
|
||
if len(lmList) != 0: | ||
fingers = [] | ||
|
||
if lmList[tipIds[0]][1] > lmList[tipIds[0] - 1][1]: | ||
fingers.append(1) | ||
else: | ||
fingers.append(0) | ||
|
||
for id in range(1,5): | ||
if lmList[tipIds[id]][2] < lmList[tipIds[id]- 2][2]: | ||
fingers.append(1) | ||
else: | ||
fingers.append(0) | ||
#print(fingers) | ||
totalFingers = fingers.count(1) | ||
#print(totalFingers-1) | ||
|
||
h, w, c = overlayList[totalFingers-1].shape | ||
img[0:h, 0:w] = overlayList[totalFingers-1] | ||
cv2.rectangle(img, (20, 225), (170, 425), (255, 255, 255), cv2.FILLED) | ||
cv2.putText(img, str(totalFingers), (45, 375), cv2.FONT_HERSHEY_PLAIN, | ||
10, (226, 183, 137), 25) | ||
cTime = time.time() | ||
fps = 1 / (cTime - pTime) | ||
pTime = cTime | ||
|
||
cv2.putText(img, f'FPS: {int(fps)}', (400, 70), cv2.FONT_HERSHEY_PLAIN, | ||
3, (255, 0, 0), 3) | ||
|
||
|
||
|
||
|
||
|
||
cv2.imshow("Image", img) | ||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
import cv2 | ||
import mediapipe as mp | ||
import time | ||
|
||
cap = cv2.VideoCapture(0) | ||
|
||
mpHands = mp.solutions.hands | ||
hands = mpHands.Hands(max_num_hands=4) | ||
mpDraw = mp.solutions.drawing_utils | ||
|
||
cTime = 0 | ||
pTime = 0 | ||
|
||
while True: | ||
success, img = cap.read() | ||
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | ||
results = hands.process(imgRGB) | ||
#print(results.multi_hand_landmarks) | ||
if results.multi_hand_landmarks: | ||
for handLms in results.multi_hand_landmarks: | ||
for id, lm, in enumerate(handLms.landmark): | ||
|
||
h, w, c = img.shape | ||
cx, cy = int(lm.x*w), int(lm.y*h) | ||
print(id, cx, cy) | ||
# if id == 4: | ||
cv2.circle(img, (cx, cy), 7, (255,0,255), cv2.FILLED) | ||
|
||
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS) | ||
|
||
cTime = time.time() | ||
fps = 1/(cTime-pTime) | ||
pTime = cTime | ||
|
||
cv2.putText(img,str(int(fps)),(10,70,), cv2.FONT_HERSHEY_PLAIN,3, | ||
(255,0,255), 3) | ||
|
||
|
||
|
||
cv2.imshow("Image", img) | ||
|
||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
import cv2 | ||
import mediapipe as mp | ||
import time | ||
class handDetector(): | ||
def __init__(self, mode=False, maxHands=2, modelComplex=1, detectionCon=0.5, trackCon=0.5): | ||
self.mode = mode | ||
self.maxHands = maxHands | ||
self.modelComplex = modelComplex | ||
self.detectionCon = detectionCon | ||
self.trackCon = trackCon | ||
self.mpHands = mp.solutions.hands | ||
self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.modelComplex, self.detectionCon, self.trackCon) | ||
|
||
self.mpDraw = mp.solutions.drawing_utils | ||
def findHands(self, img, draw=True): | ||
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | ||
self.results = self.hands.process(imgRGB) | ||
# print(results.multi_hand_landmarks) | ||
if self.results.multi_hand_landmarks: | ||
for handLms in self.results.multi_hand_landmarks: | ||
if draw: | ||
self.mpDraw.draw_landmarks(img, handLms, | ||
self.mpHands.HAND_CONNECTIONS) | ||
return img | ||
def findPosition(self, img, handNo=0, draw=True): | ||
lmList = [] | ||
if self.results.multi_hand_landmarks: | ||
myHand = self.results.multi_hand_landmarks[handNo] | ||
for id, lm in enumerate(myHand.landmark): | ||
# print(id, lm) | ||
h, w, c = img.shape | ||
cx, cy = int(lm.x * w), int(lm.y * h) | ||
# print(id, cx, cy) | ||
lmList.append([id, cx, cy]) | ||
if draw: | ||
cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) | ||
return lmList | ||
def main(): | ||
pTime = 0 | ||
cTime = 0 | ||
cap = cv2.VideoCapture(0) | ||
detector = handDetector() | ||
while True: | ||
success, img = cap.read() | ||
img = detector.findHands(img) | ||
lmList = detector.findPosition(img) | ||
if len(lmList) != 0: | ||
print(lmList[4]) | ||
cTime = time.time() | ||
fps = 1 / (cTime - pTime) | ||
pTime = cTime | ||
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, | ||
(255, 0, 255), 3) | ||
cv2.imshow("Image", img) | ||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break | ||
if __name__ == "__main__": | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
import cv2 | ||
import time | ||
import numpy as np | ||
import HandTrackingModule as htm | ||
import math | ||
from ctypes import cast, POINTER | ||
from comtypes import CLSCTX_ALL | ||
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume | ||
|
||
|
||
|
||
|
||
wCam, hCam = 640, 480 | ||
################################ | ||
cap = cv2.VideoCapture(0) | ||
cap.set(3, wCam) | ||
cap.set(4, hCam) | ||
pTime = 0 | ||
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() | ||
print(volume.GetVolumeRange()) | ||
volume.SetMasterVolumeLevel(0, None) | ||
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 | ||
cv2.circle(img, (x1, y1), 15, (255, 0, 255), cv2.FILLED) | ||
cv2.circle(img, (x2, y2), 15, (255, 0, 255), cv2.FILLED) | ||
cv2.line(img, (x1, y1), (x2, y2), (255, 0, 255), 3) | ||
cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) | ||
length = math.hypot(x2 - x1, y2 - y1) | ||
|
||
|
||
vol = np.interp(length, [50, 300], [minVol, maxVol]) | ||
volBar = np.interp(length, [50, 300], [400, 150]) | ||
volPer = np.interp(length, [50, 300], [0, 100]) | ||
print(int(length),vol) | ||
if length<=50: | ||
cv2.circle(img, (cx, cy),15, (0, 255, 0), cv2.FILLED) | ||
cv2.rectangle(img, (50, 150), (85, 400), (255, 0, 0), 3) | ||
cv2.rectangle(img, (50, int(volBar)), (85, 400), (255, 0, 0), cv2.FILLED) | ||
cv2.putText(img, f'{int(volPer)} %', (40, 450), cv2.FONT_HERSHEY_COMPLEX, | ||
1, (0, 255, 0), 3) | ||
|
||
cTime = time.time() | ||
fps = 1 / (cTime - pTime) | ||
pTime = cTime | ||
cv2.putText(img, f'FPS: {int(fps)}', (40, 50), cv2.FONT_HERSHEY_COMPLEX, | ||
1, (0, 255, 0), 3) | ||
cv2.imshow("Img", img) | ||
|
||
|
||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import cv2 | ||
import time | ||
import numpy as np | ||
import HandTrackingModule as htm | ||
import math | ||
from ctypes import cast, POINTER | ||
from comtypes import CLSCTX_ALL | ||
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume | ||
################################ | ||
wCam, hCam = 640, 480 | ||
################################ | ||
cap = cv2.VideoCapture(0) | ||
cap.set(3, wCam) | ||
cap.set(4, hCam) | ||
pTime = 0 | ||
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 | ||
cv2.circle(img, (x1, y1), 15, (255, 0, 255), cv2.FILLED) | ||
cv2.circle(img, (x2, y2), 15, (255, 0, 255), cv2.FILLED) | ||
cv2.line(img, (x1, y1), (x2, y2), (255, 0, 255), 3) | ||
cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) | ||
length = math.hypot(x2 - x1, y2 - y1) | ||
# print(length) | ||
# Hand range 50 - 300 | ||
# Volume Range -65 - 0 | ||
vol = np.interp(length, [50, 170], [minVol, maxVol]) | ||
volBar = np.interp(length, [50, 170], [400, 150]) | ||
volPer = np.interp(length, [50, 170], [0, 100]) | ||
print(length) | ||
volume.SetMasterVolumeLevel(vol, None) | ||
if length <= 50: | ||
cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED) | ||
cv2.rectangle(img, (50, 150), (85, 400), (255, 0, 0), 3) | ||
cv2.rectangle(img, (50, int(volBar)), (85, 400), (255, 0, 0), cv2.FILLED) | ||
cv2.putText(img, f'{int(volPer)} %', (40, 450), cv2.FONT_HERSHEY_COMPLEX, | ||
1, (255, 0, 0), 3) | ||
cTime = time.time() | ||
fps = 1 / (cTime - pTime) | ||
pTime = cTime | ||
cv2.putText(img, f'FPS: {int(fps)}', (40, 50), cv2.FONT_HERSHEY_COMPLEX, | ||
1, (255, 0, 0), 3) | ||
cv2.imshow("Img", img) | ||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break |