import cv2 import time import os from ultralytics import YOLO import logging # Отключаем вывод ненужных логов из ultralytics logging.getLogger('ultralytics').setLevel(logging.WARNING) # Загружаем модель YOLOv8 model = YOLO('yolov8n.pt') # Захват видео с камеры cap = cv2.VideoCapture(0) # Устанавливаем разрешение для захвата кадров cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) # Получаем FPS из камеры fps = cap.get(cv2.CAP_PROP_FPS) print(f"FPS камеры: {fps}") # Установим FPS записи видео равным FPS камеры record_fps = fps # Записываем с FPS, который камера реально поддерживает # Время между кадрами (в секундах) frame_interval = 1 / record_fps recording = False record_start_time = 0 out = None last_frame_time = 0 # Путь для сохранения видео save_dir = r'C:\Users\ilyac\PycharmProjects\YOLOv8\.venv\video' os.makedirs(save_dir, exist_ok=True) # Создаст папку, если не существует # Используем кодек MJPG для записи видео с хорошим качеством fourcc = cv2.VideoWriter_fourcc(*'MJPG') while True: ret, frame = cap.read() if not ret: break # Применяем модель YOLOv8 для обнаружения объектов results = model(frame)[0] person_detected = False # Проходим по результатам и рисуем рамки вокруг людей for result in results.boxes: cls_id = int(result.cls[0]) if model.names[cls_id] == 'person': person_detected = True x1, y1, x2, y2 = map(int, result.xyxy[0]) # Уменьшаем ширину рамки на 20% width_shrink = int((x2 - x1) * 0.2) x1 += width_shrink x2 -= width_shrink cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # Начинаем запись, если человек был обнаружен if person_detected and not recording: print("🟢 Обнаружен человек — начинаю запись на 10 секунд") record_start_time = time.time() timestamp = time.strftime('%Y-%m-%d_%H-%M-%S') video_path = os.path.join(save_dir, f'person_{timestamp}.avi') out = cv2.VideoWriter(video_path, fourcc, record_fps, (frame.shape[1], frame.shape[0])) recording = True # Запись видео с интервалом времени if recording: current_time = time.time() # Пишем кадр в видео, если прошло достаточно времени if current_time - last_frame_time >= frame_interval: out.write(frame) last_frame_time = current_time # Проверяем, прошло ли 10 секунд if current_time - record_start_time >= 10: print("🔴 10 секунд прошло — запись завершена") recording = False out.release() out = None # Отображаем видео в окне cv2.imshow("Live", frame) # Выход по клавише ESC if cv2.waitKey(1) & 0xFF == 27: break # Завершаем работу с камерой и записывающим устройством cap.release() if out: out.release() cv2.destroyAllWindows()