You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.6 KiB
99 lines
3.6 KiB
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()
|
|
|