example_ROI_detection
README.md
Прототип системы детекции уборки столиков по видео
Упрощенный рабочий прототип для одного видео и одного выбранного столика (ROI).
Требования и установка
- Убедись, что установлен Python 3.8+
- Установи зависимости:
Запуск
При запуске:
- На первом кадре появится окно выбора ROI (
) — выдели один четко видимый столик.cv2.selectROI - Далее скрипт обработает видео, запишет результат в
и посчитает аналитику.output.mp4
Какой столик выбран
- Видео: video1.mp4
- Столик: тот, который ты выделил(а) мышкой в окне ROI на первом кадре.
- Координаты ROI будут напечатаны в консоль в формате
— при необходимости вставь их в этот README.ROI выбран: (x, y, w, h)
Логика детекции событий
Детекция людей выполняется YOLOv8n () класса ultralytics.person
Для событий учитывается только выбранная область стола (ROI):
- Человек считается находящимся в ROI, если bbox человека пересекается с ROI и пересечение покрывает долю bbox площади не меньше
.0.05 - События подтверждаются антидребезгом:
: человек должен детектироваться в ROI минимумСтол занят (OCCUPIED)кадров подряд.N=15: отсутствие человека должно подтверждаться минимумСтол пуст (EMPTY)кадров подряд.M=25
: момент первого детектирования человека в ROI после подтвержденной пустоты (событие фиксируется до подтвержденияПодход к столу (APPROACHED)).OCCUPIED
Аналитика (Pandas)
Все события пишутся в с полями:
pandas.DataFrame, frame, timestamp_sec, event_type.details
Для каждого момента находится следующий EMPTY и считается задержка:APPROACHED
- time_to_next_approach = APPROACHED.timestamp_sec - EMPTY.timestamp_sec
Среднее значение:
- выводится в консоль
- сохраняется в файл analytics_report.txt
Результат работы
: видео с рамкой ROI вокруг столика; цвет рамки меняется по состоянию:output.mp4
- зеленый — EMPTY
- красный — OCCUPIED
: сохраняется кадр на момент фиксацииexample_problem_frame.png(может быть использован как “пример проблемного кадра”).APPROACHED
Пример задержки
В репозитории уже лежит пример результата в :
analytics_report.txtСредняя задержка: 4.53 сек (EMPTY -> APPROACHED).
После запуска на твоем значение будет пересчитано.video1.mp4