Как в теле бесконечного цикла однократно выполнить действие?

Решаю задачу по распознаванию объектов через камеру и openCV. Внутри бесконечного цикла запустил камеру. Хочу в момент, когда в поле зрении камеры появляется объект - скрипт мне однократно написал в консоль "yes". Но в консоль "yes" падает так долго, как долго находится объект в поле зрения камеры.

Вообще конечная задача - послать однократный сигнал на Arduino.

import cv2

def cam():
    camera = cv2.VideoCapture(0)
    i_see = False  # флаг нахождения контура

    while True:
            success, frame = camera.read()

            if success:                                              # если прочитали успешно
                hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)         # переводим BGR в HSV
                binary = cv2.inRange(hsv, (30, 50, 70), (60, 255, 255))          # пороговая обработка кадра

                con, _ = cv2.findContours(binary,
                                                  cv2.RETR_EXTERNAL,
                                                  cv2.CHAIN_APPROX_NONE)  # получаем контуры объектов

                if len(con) != 0:                                     # если нашли хоть 1 контур
                    max_con = max(con, key=cv2.contourArea)           # выбираем самый большой
                    moments = cv2.moments(max_con)                    # получаем моменты контура

                    if moments["m00"] > 500:                           # площадь контура px

                        cx = int(moments["m10"] / moments["m00"])     # центр контура по x
                        cy = int(moments["m10"] / moments["m00"])     # центр контура по y

                        i_see = True                                # меняем флаг, если нашли контур
                        print("yes")

                    cv2.imshow('Video', binary)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

    camera.release()
    cv2.destroyAllWindows()

cam()

Ответы (1 шт):

Автор решения: denisnumb

По идее нужно отслеживать момент появления объекта, а не его присутствие.

Можно сделать флаг, который будет устанавливаться при первом написании yes и далее при положительном значении флага обработка наличия объекта производиться не будет. Как только объект пропадает, флаг нужно сбросить

object_detected = False

while True:

    . . .

    if len(con) != 0:
    
        . . .
    
        if moments["m00"] > 500 and not object_detected:
            print("yes")
            object_detected = True

        else:
            object_detected = False
    
    . . .
→ Ссылка