Хочу написать программу которая при распознавании жеста рукой, добавляет символ в строку. Но при попытке сделать жест этот текст изменяется до момента прекращения жеста. Как сделать чтобы когда делался жест в общую строку добавлялся лишь один символ? Вот собственно код:
import cv2
import mediapipe as mp
import math
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
now = ""
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 = False
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
for id, lm in enumerate(hand_landmarks.landmark):
h, w, c = image.shape
dots = list(enumerate(hand_landmarks.landmark))
x_big = dots[4][1].x * w
y_big = dots[4][1].y * h
# указательный палец
x_forefinger = dots[8][1].x * w
y_forefinger = dots[8][1].y * h
# средний палец
x_middle = dots[12][1].x * w
y_middle = dots[12][1].y * h
# безымянный палец
x_ring = dots[16][1].x * w
y_ring = dots[16][1].y * h
# маленький палец
x_little = dots[20][1].x * w
y_little = dots[20][1].y * h
# запястье
x_wrist = dots[0][1].x * w
y_wrist= dots[0][1].y * h
# основание большого пальца
x_big_base = dots[1][1].x*w
y_big_base = dots[1][1].y*w
# основание указательного пальца
x_forefinger_base = dots[5][1].x*w
y_forefinger_base = dots[5][1].y*h
# основание среднего пальца
x_middle_base = dots[9][1].x*w
y_middle_base = dots[9][1].y*h
# основание безымянного пальца
x_ring_base = dots[13][1].x*w
y_ring_base = dots[13][1].y*h
# основание маленького пальца
x_little_base = dots[17][1].x*w
y_little_base = dots[17][1].y*h
# расстояние между 0 и 17
dist_0_17 = int(math.sqrt(pow(x_little_base - x_wrist, 2) + pow(y_little_base - y_wrist, 2)))
# растояние между большим и указательным
delta_thumb_forefinger= int(math.sqrt(pow(x_forefinger - x_big, 2) + pow(y_forefinger - y_big, 2)))
# расстояние между большим и средним
delta_thumb_middle = int(math.sqrt(pow(x_middle - x_big, 2) + pow(y_middle - y_big, 2)))
# расстояние между большим и безымянным
delta_thumb_ring = int(math.sqrt(pow(x_ring - x_big, 2) + pow(y_ring - y_big, 2)))
# расстояние между большим и мизинцем
delta_thumb_little = int(math.sqrt(pow(x_little - x_big, 2) + pow(y_little - y_big, 2)))
# расстояние между указательным и его основанием
delta_forefinger_base = int(math.sqrt(pow(x_forefinger_base - x_forefinger, 2) + pow(y_forefinger_base - y_forefinger, 2)))
# расстояние между большим и его основанием
delta_thumb_base = int(math.sqrt(pow(x_big - x_big_base, 2) + pow(y_big -y_big_base, 2)))
# расстояние между средним и его основанием
delta_middle_base = int(math.sqrt(pow(x_middle - x_middle_base, 2) + pow(y_middle - y_middle_base,2)))
# растояние между кончика мизинца и запясьтем
d_little_wrist = int(math.sqrt(pow(x_wrist -x_little, 2) + pow(y_wrist - y_little, 2)))
# расстояние между кочника мизинца и его основанием
d_little_base = int(math.sqrt(pow(x_little - x_little_base, 2) + pow(y_little - y_little_base, 2)))
# расстояние между кончиками указательного и среднего палец
d_foref_middl = int(math.sqrt(pow(x_forefinger - x_middle, 2) + pow(y_forefinger - y_middle, 2)))
# знак -
if d_little_base < 45 :
now += '-'
# буква Р
if delta_thumb_middle < 32 and delta_thumb_forefinger > 45 and delta_thumb_ring>45:
now += 'r'
# знак .
if delta_thumb_forefinger < 32 and delta_thumb_ring >45 and delta_thumb_middle > 45 and delta_thumb_little > 50:
now += '.'
cv2.putText(image,"Now: {}".format(now), (300, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2,)
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())
cv2.imshow('Gesture recognition', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()