YoloV8
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user