Initial commit: Werewolf game with voice prompts
This commit is contained in:
commit
5cdc9fdf82
63 changed files with 1387 additions and 0 deletions
87
werewoolf/finger_count.py
Normal file
87
werewoolf/finger_count.py
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# code inspiration from https://www.geekering.com/categories/computer-vision/marcellacavalcanti/hand-tracking-and-finger-counting-in-python-with-mediapipe/ because i dont know how to use mediapipe
|
||||
|
||||
import cv2
|
||||
import mediapipe as mp
|
||||
import time
|
||||
|
||||
mp_drawing = mp.solutions.drawing_utils
|
||||
mp_drawing_styles = mp.solutions.drawing_styles
|
||||
mp_hands = mp.solutions.hands
|
||||
|
||||
def count_fingers(stable_duration=2):
|
||||
previous_finger_count = -1 # Initialize to an invalid count
|
||||
stable_start_time = None # To track when the count became stable
|
||||
cap = cv2.VideoCapture(0)
|
||||
with mp_hands.Hands(
|
||||
model_complexity=0,
|
||||
min_detection_confidence=0.5,
|
||||
min_tracking_confidence=0.5) as hands:
|
||||
|
||||
while cap.isOpened():
|
||||
success, image = cap.read()
|
||||
if not success:
|
||||
print("Ignoring empty camera frame.")
|
||||
continue
|
||||
|
||||
image.flags.writeable = False
|
||||
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||||
results = hands.process(image)
|
||||
|
||||
image.flags.writeable = True
|
||||
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
|
||||
|
||||
fingerCount = 0 # Reset fingerCount for each frame
|
||||
|
||||
if results.multi_hand_landmarks:
|
||||
for hand_landmarks in results.multi_hand_landmarks:
|
||||
handIndex = results.multi_hand_landmarks.index(hand_landmarks)
|
||||
handLabel = results.multi_handedness[handIndex].classification[0].label
|
||||
|
||||
handLandmarks = []
|
||||
for landmarks in hand_landmarks.landmark:
|
||||
handLandmarks.append([landmarks.x, landmarks.y])
|
||||
|
||||
# Count fingers
|
||||
if handLabel == "Left" and handLandmarks[4][0] > handLandmarks[3][0]:
|
||||
fingerCount += 1
|
||||
elif handLabel == "Right" and handLandmarks[4][0] < handLandmarks[3][0]:
|
||||
fingerCount += 1
|
||||
|
||||
if handLandmarks[8][1] < handLandmarks[6][1]: # Index finger
|
||||
fingerCount += 1
|
||||
if handLandmarks[12][1] < handLandmarks[10][1]: # Middle finger
|
||||
fingerCount += 1
|
||||
if handLandmarks[16][1] < handLandmarks[14][1]: # Ring finger
|
||||
fingerCount += 1
|
||||
if handLandmarks[20][1] < handLandmarks[18][1]: # Pinky
|
||||
fingerCount += 1
|
||||
|
||||
# Draw hand landmarks
|
||||
mp_drawing.draw_landmarks(
|
||||
image,
|
||||
hand_landmarks,
|
||||
mp_hands.HAND_CONNECTIONS,
|
||||
mp_drawing_styles.get_default_hand_landmarks_style(),
|
||||
mp_drawing_styles.get_default_hand_connections_style())
|
||||
|
||||
# Display finger count
|
||||
cv2.putText(image, str(fingerCount), (50, 450), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 0, 0), 10)
|
||||
#Display image
|
||||
cv2.imshow('Finger Count', image)
|
||||
|
||||
# Check if the finger count is stable
|
||||
if fingerCount == previous_finger_count and fingerCount != 0:
|
||||
if stable_start_time is None:
|
||||
stable_start_time = time.time() # Start the timer
|
||||
elif time.time() - stable_start_time >= stable_duration and fingerCount != 0:
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
return fingerCount # Return the stable finger count
|
||||
else:
|
||||
stable_start_time = None # Reset the timer if the count changes
|
||||
|
||||
previous_finger_count = fingerCount # Update the previous count
|
||||
if cv2.waitKey(5) & 0xFF == 27:
|
||||
break
|
||||
|
||||
return None # Return None if the loop ends without a stable count
|
||||
Loading…
Add table
Add a link
Reference in a new issue