Как сделать чтобы условие выполнялось лишь раз?

Хочу написать программу которая при распознавании жеста рукой, добавляет символ в строку. Но при попытке сделать жест этот текст изменяется до момента прекращения жеста. Как сделать чтобы когда делался жест в общую строку добавлялся лишь один символ? Вот собственно код:
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()
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 1
@erus71an
определить флаг булева типа аля "условие сработало" со значением FALSE, добавить на него проверку что значение ложно в условие добавления символа и при срабатывании условия поменять на TRUE
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы