Python: если X обнаружен более чем за T секунд:

#python #if-statement #time #tracking #seconds

Вопрос:

Я ищу Знания.

Я новичок в python, и мне нужно сделать проект с гравитацией камеры: HuskyLens. Он позволяет отображать блоки при обнаружении лиц (вокруг лица, он отслеживает вкратце). И я хотел бы, когда я обнаруживаю блок, знать, обнаруживается ли он более 7 секунд.

 import time
import json
from huskylib import HuskyLensLibrary

# Initialize
#hl = HuskyLensLibrary("I2C", "", address = 0x32)
hl = HuskyLensLibrary("SERIAL", "/dev/ttyUSB0", 3000000)

# Change to face recognition algorithms
hl.algorithms("ALGORITHM_FACE_RECOGNITION")

timer = time.time()

while True:
    blocks = hl.requestAll()

    for block in blocks:
        if block.type == "BLOCK": # If a block is detected
            print("Face !")
            if BLOCK DETECTED MORE THAN 7 SECONDS: # If a block is detected more than 7 seconds
                print("SCREAMER ! BOO !")
                time.sleep(0.5)
        else:
            print("No Face !")
            time.sleep(0.5)
 

Я не знаю, достаточно ли это ясно, меня интересует любая информация, позволяющая мне прогрессировать

ps: Я уже ходил гулять по библиотеке Времени, но мне не удалось все понять и поэтому найти свое счастье.

Ответ №1:

Возможно, я ошибаюсь, но вы могли бы попытаться отследить , каким был последний блок, а затем, пока тип последнего блока "BLOCK" , вы можете увеличить таймер.

Что я имею в виду:

 face_apparition_time = 0  # We haven't seen a face yet, so apparition time is 0
# Gives a time in seconds since a fixed point we don't control, we'll use it as a checkpoint
timer = time.time()
last_block_seen = None  # Begin with None, we haven't seen any block yet

while True:
    blocks = hl.requestAll()

    for block in blocks:
        if block.type == "BLOCK":  # If a block is detected
            print("Face !")

            # Then we check if the last block was also a "BLOCK". If yes, we increase our timer.
            if last_block_seen == "BLOCK":
                # We count the number of seconds between the last checkpoint and now.
                face_apparition_time = time.time() - timer

            # Then we chack if a face has appeared for more than 7 seconds:
            if face_apparition_time > 7:  # If a block is detected more than 7 seconds.
                print("SCREAMER ! BOO !")

        else:
            print("No Face !")

            # As we don't see no face, we have to reset our checkpoint to "now"
            timer = time.time()
            face_apparition_time = 0

        # Do not forget that we are going to look at the next block, so this block must be stored :)
        last_block_seen = block.type
        time.sleep(0.5)
 

Я не уверен, куда time.sleep() следует идти, вы можете попробовать сами, что подходит лучше 🙂
Надеюсь, это поможет, не стесняйтесь задавать дальнейшие вопросы!

Комментарии:

1. Здравствуйте, спасибо за ваш ответ, он работает почти так, как должен, проблема в том, что время идет, и если я, например, нахожусь в 5 секундах и обнаруживаю лицо, для отображения «КРИКУН БУ» требуется всего 2 секунды, а не 7 . Есть также момент, который я не совсем понимаю, часть: face_apparition_time = time.time () — таймер, поскольку «таймер = время.время()» (выше), почему это не равно 0? Это, конечно, глупый вопрос, но я бы предпочел задать его, чем блокировать, Так как, безусловно, в этой части я не понимаю, что решение должно быть найдено, мне трудно его разблокировать.

2. На самом деле (вы можете попробовать сами) time.time() возвращает фактическое количество секунд, отсчитанных с фиксированного момента (например, с 1 января 1900 года, например) до настоящего времени. Так что это будет меняться каждую секунду. Таким t образом, вы получите, скажем, 125,003 секунды за один раз. И если вы вызовете его снова в t 3 секундах, вы получите 125,006 секунды. Затем вы должны сделать различие между обоими, чтобы знать, что между и было 3 секунды t t 3 .