commit
					ec994e6a67
				
				 10 changed files with 222 additions and 0 deletions
			
			
		@ -0,0 +1,3 @@ | 
				
			|||||||
 | 
					# Default ignored files | 
				
			||||||
 | 
					/shelf/ | 
				
			||||||
 | 
					/workspace.xml | 
				
			||||||
@ -0,0 +1,10 @@ | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||||
 | 
					<module type="PYTHON_MODULE" version="4"> | 
				
			||||||
 | 
					  <component name="NewModuleRootManager"> | 
				
			||||||
 | 
					    <content url="file://$MODULE_DIR$"> | 
				
			||||||
 | 
					      <excludeFolder url="file://$MODULE_DIR$/.venv" /> | 
				
			||||||
 | 
					    </content> | 
				
			||||||
 | 
					    <orderEntry type="inheritedJdk" /> | 
				
			||||||
 | 
					    <orderEntry type="sourceFolder" forTests="false" /> | 
				
			||||||
 | 
					  </component> | 
				
			||||||
 | 
					</module> | 
				
			||||||
@ -0,0 +1,6 @@ | 
				
			|||||||
 | 
					<component name="InspectionProjectProfileManager"> | 
				
			||||||
 | 
					  <settings> | 
				
			||||||
 | 
					    <option name="USE_PROJECT_PROFILE" value="false" /> | 
				
			||||||
 | 
					    <version value="1.0" /> | 
				
			||||||
 | 
					  </settings> | 
				
			||||||
 | 
					</component> | 
				
			||||||
@ -0,0 +1,7 @@ | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||||
 | 
					<project version="4"> | 
				
			||||||
 | 
					  <component name="Black"> | 
				
			||||||
 | 
					    <option name="sdkName" value="Python 3.12 (YOLOv8)" /> | 
				
			||||||
 | 
					  </component> | 
				
			||||||
 | 
					  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (YOLOv8)" project-jdk-type="Python SDK" /> | 
				
			||||||
 | 
					</project> | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||||
 | 
					<project version="4"> | 
				
			||||||
 | 
					  <component name="ProjectModuleManager"> | 
				
			||||||
 | 
					    <modules> | 
				
			||||||
 | 
					      <module fileurl="file://$PROJECT_DIR$/.idea/YOLOv8.iml" filepath="$PROJECT_DIR$/.idea/YOLOv8.iml" /> | 
				
			||||||
 | 
					    </modules> | 
				
			||||||
 | 
					  </component> | 
				
			||||||
 | 
					</project> | 
				
			||||||
@ -0,0 +1,37 @@ | 
				
			|||||||
 | 
					import cv2 | 
				
			||||||
 | 
					from ultralytics import YOLO | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Загрузим YOLOv8 модель (если ты скачал .pt файл вручную, укажи путь) | 
				
			||||||
 | 
					model = YOLO('yolov8n.pt')  # автоматически скачается, если файла нет | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Открываем веб-камеру | 
				
			||||||
 | 
					cap = cv2.VideoCapture(0) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while True: | 
				
			||||||
 | 
					    ret, frame = cap.read() | 
				
			||||||
 | 
					    if not ret: | 
				
			||||||
 | 
					        break | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Детекция объектов | 
				
			||||||
 | 
					    results = model(frame)[0] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for result in results.boxes: | 
				
			||||||
 | 
					        cls_id = int(result.cls[0]) | 
				
			||||||
 | 
					        conf = float(result.conf[0]) | 
				
			||||||
 | 
					        if model.names[cls_id] == 'person': | 
				
			||||||
 | 
					            x1, y1, x2, y2 = map(int, result.xyxy[0]) | 
				
			||||||
 | 
					            # Зелёная рамка | 
				
			||||||
 | 
					            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) | 
				
			||||||
 | 
					            # Текст | 
				
			||||||
 | 
					            label = f'{model.names[cls_id]} {conf:.2f}' | 
				
			||||||
 | 
					            cv2.putText(frame, label, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Показываем результат | 
				
			||||||
 | 
					    cv2.imshow("Detection", frame) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Выход — по клавише ESC | 
				
			||||||
 | 
					    if cv2.waitKey(1) & 0xFF == 27: | 
				
			||||||
 | 
					        break | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cap.release() | 
				
			||||||
 | 
					cv2.destroyAllWindows() | 
				
			||||||
@ -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() | 
				
			||||||
@ -0,0 +1,33 @@ | 
				
			|||||||
 | 
					import cv2 | 
				
			||||||
 | 
					import time | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Открытие видеофайла | 
				
			||||||
 | 
					cap = cv2.VideoCapture(r'C:\Users\ilyac\PycharmProjects\YOLOv8\.venv\video\person_2025-04-07_23-36-45.avi')  # Укажите путь к вашему видеофайлу | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if not cap.isOpened(): | 
				
			||||||
 | 
					    print("Ошибка при открытии видео!") | 
				
			||||||
 | 
					    exit() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Получаем FPS видео (кадров в секунду) | 
				
			||||||
 | 
					fps = cap.get(cv2.CAP_PROP_FPS) | 
				
			||||||
 | 
					print(f"FPS видео: {fps}") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while cap.isOpened(): | 
				
			||||||
 | 
					    ret, frame = cap.read() | 
				
			||||||
 | 
					    if not ret: | 
				
			||||||
 | 
					        break  # Если не удалось прочитать кадр, завершаем | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Отображаем кадр | 
				
			||||||
 | 
					    cv2.imshow('Video', frame) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Добавляем задержку между кадрами для замедления видео | 
				
			||||||
 | 
					    # Если FPS = 30, а мы хотим воспроизводить в 2 раза медленным темпом, ставим задержку 2x | 
				
			||||||
 | 
					    time.sleep(1 / fps * 4)  # Умножаем на 2 для замедления воспроизведения | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Выход из программы при нажатии клавиши 'ESC' | 
				
			||||||
 | 
					    if cv2.waitKey(1) & 0xFF == 27: | 
				
			||||||
 | 
					        break | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Закрываем все окна и освобождаем ресурсы | 
				
			||||||
 | 
					cap.release() | 
				
			||||||
 | 
					cv2.destroyAllWindows() | 
				
			||||||
									
										Binary file not shown.
									
								
							
						
					Loading…
					
					
				
		Reference in new issue