SMART-27 Merge pull request 'gestures' (#11) from gestures into master
Reviewed-on: #11
This commit is contained in:
commit
040b260a88
38
gestures/gesture_recognition.py
Normal file
38
gestures/gesture_recognition.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import cv2
|
||||||
|
import mediapipe as mp
|
||||||
|
import simple_gestures_lib as sgest
|
||||||
|
|
||||||
|
mp_drawing = mp.solutions.drawing_utils
|
||||||
|
mp_hands = mp.solutions.hands
|
||||||
|
from math import sqrt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
hands = mp_hands.Hands(
|
||||||
|
min_detection_confidence=0.5, min_tracking_confidence=0.5)
|
||||||
|
cap = cv2.VideoCapture(0)
|
||||||
|
while cap.isOpened():
|
||||||
|
success, image = cap.read()
|
||||||
|
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
|
||||||
|
image.flags.writeable = False
|
||||||
|
results = hands.process(image)
|
||||||
|
|
||||||
|
image.flags.writeable = True
|
||||||
|
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
|
||||||
|
if results.multi_hand_landmarks:
|
||||||
|
for hand_landmarks in results.multi_hand_landmarks:
|
||||||
|
mp_drawing.draw_landmarks(
|
||||||
|
image, hand_landmarks, mp_hands.HAND_CONNECTIONS)
|
||||||
|
if cv2.waitKey(33) == ord('s'):
|
||||||
|
if results.multi_hand_landmarks:
|
||||||
|
for hand_landmarks in results.multi_hand_landmarks:
|
||||||
|
print(sgest.check_index_finger(hand_landmarks))
|
||||||
|
print(sgest.check_middle_finger(hand_landmarks))
|
||||||
|
print(sgest.check_ring_finger(hand_landmarks))
|
||||||
|
print(sgest.check_pinky_finger(hand_landmarks))
|
||||||
|
|
||||||
|
cv2.imshow('MediaPipe Hands', image)
|
||||||
|
if cv2.waitKey(5) & 0xFF == 27:
|
||||||
|
break
|
||||||
|
hands.close()
|
||||||
|
cap.release()
|
78
gestures/simple_gestures_lib.py
Normal file
78
gestures/simple_gestures_lib.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
from math import sqrt
|
||||||
|
|
||||||
|
def calculate_distance(ax, ay, bx, by):
|
||||||
|
distance = sqrt(((bx - ax) ** 2 + (by - ay) ** 2))
|
||||||
|
return distance
|
||||||
|
|
||||||
|
def check_index_finger(hand_landmarks):
|
||||||
|
ax = hand_landmarks.landmark[8].x
|
||||||
|
ay = hand_landmarks.landmark[8].y
|
||||||
|
bx = hand_landmarks.landmark[5].x
|
||||||
|
by = hand_landmarks.landmark[5].y
|
||||||
|
distance_8_5 = calculate_distance(ax, ay, bx, by)
|
||||||
|
ax = hand_landmarks.landmark[5].x
|
||||||
|
ay = hand_landmarks.landmark[5].y
|
||||||
|
bx = hand_landmarks.landmark[0].x
|
||||||
|
by = hand_landmarks.landmark[0].y
|
||||||
|
distance_5_0 = calculate_distance(ax, ay, bx, by)
|
||||||
|
|
||||||
|
if (distance_5_0 < distance_8_5 + 0.1):
|
||||||
|
result = "wskazujacy_wyprostowany"
|
||||||
|
else:
|
||||||
|
result = "wskazujacy_niewyprostowany"
|
||||||
|
return (result, hand_landmarks.landmark[8].x, hand_landmarks.landmark[8].y)
|
||||||
|
|
||||||
|
def check_middle_finger(hand_landmarks):
|
||||||
|
ax = hand_landmarks.landmark[12].x
|
||||||
|
ay = hand_landmarks.landmark[12].y
|
||||||
|
bx = hand_landmarks.landmark[9].x
|
||||||
|
by = hand_landmarks.landmark[9].y
|
||||||
|
distance_12_9 = calculate_distance(ax, ay, bx, by)
|
||||||
|
ax = hand_landmarks.landmark[9].x
|
||||||
|
ay = hand_landmarks.landmark[9].y
|
||||||
|
bx = hand_landmarks.landmark[0].x
|
||||||
|
by = hand_landmarks.landmark[0].y
|
||||||
|
distance_9_0 = calculate_distance(ax, ay, bx, by)
|
||||||
|
|
||||||
|
if (distance_9_0 < distance_12_9 + 0.1):
|
||||||
|
result = "srodkowy_wyprostowany"
|
||||||
|
else:
|
||||||
|
result = "srodkowy_niewyprostowany"
|
||||||
|
return (result, hand_landmarks.landmark[12].x, hand_landmarks.landmark[12].y)
|
||||||
|
|
||||||
|
def check_ring_finger(hand_landmarks):
|
||||||
|
ax = hand_landmarks.landmark[16].x
|
||||||
|
ay = hand_landmarks.landmark[16].y
|
||||||
|
bx = hand_landmarks.landmark[13].x
|
||||||
|
by = hand_landmarks.landmark[13].y
|
||||||
|
distance_16_13 = calculate_distance(ax, ay, bx, by)
|
||||||
|
ax = hand_landmarks.landmark[13].x
|
||||||
|
ay = hand_landmarks.landmark[13].y
|
||||||
|
bx = hand_landmarks.landmark[0].x
|
||||||
|
by = hand_landmarks.landmark[0].y
|
||||||
|
distance_13_0 = calculate_distance(ax, ay, bx, by)
|
||||||
|
|
||||||
|
if (distance_13_0 < distance_16_13 + 0.1):
|
||||||
|
result = "serdeczny_wyprostowany"
|
||||||
|
else:
|
||||||
|
result = "serdeczny_niewyprostowany"
|
||||||
|
return (result, hand_landmarks.landmark[16].x, hand_landmarks.landmark[16].y)
|
||||||
|
|
||||||
|
def check_pinky_finger(hand_landmarks):
|
||||||
|
ax = hand_landmarks.landmark[20].x
|
||||||
|
ay = hand_landmarks.landmark[20].y
|
||||||
|
bx = hand_landmarks.landmark[17].x
|
||||||
|
by = hand_landmarks.landmark[17].y
|
||||||
|
distance_20_17 = calculate_distance(ax, ay, bx, by)
|
||||||
|
ax = hand_landmarks.landmark[17].x
|
||||||
|
ay = hand_landmarks.landmark[17].y
|
||||||
|
bx = hand_landmarks.landmark[0].x
|
||||||
|
by = hand_landmarks.landmark[0].y
|
||||||
|
distance_17_0 = calculate_distance(ax, ay, bx, by)
|
||||||
|
|
||||||
|
if (distance_17_0 < distance_20_17 + 0.1):
|
||||||
|
result = "maly_wyprostowany"
|
||||||
|
else:
|
||||||
|
result = "maly_niewyprostowany"
|
||||||
|
return (result, hand_landmarks.landmark[20].x, hand_landmarks.landmark[20].y)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user