import pyrealsense2 as rs import numpy as np import cv2 import torch # Настройка потоков RealSense pipeline = rs.pipeline() config = rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) # Запуск потока pipeline.start(config) # Создание объекта для выравнивания глубины и цвета align_to = rs.stream.color align = rs.align(align_to) # Загрузка модели YOLOv5 model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) # Функция для детекции объектов с помощью YOLO def detect_objects(image): results = model(image) detections = results.xyxy[0].numpy() boxes = detections[:, :4] # x1, y1, x2, y2 confidences = detections[:, 4] class_ids = detections[:, 5].astype(int) return boxes, confidences, class_ids recognized_objects = [] try: while True: # Получение и выравнивание кадров frames = pipeline.wait_for_frames() aligned_frames = align.process(frames) depth_frame = aligned_frames.get_depth_frame() color_frame = aligned_frames.get_color_frame() if not depth_frame or not color_frame: continue # Преобразование в numpy массивы depth_image = np.asanyarray(depth_frame.get_data()) color_image = np.asanyarray(color_frame.get_data()) # Детекция объектов boxes, confidences, class_ids = detect_objects(color_image) # Для каждого обнаруженного объекта for i, box in enumerate(boxes): x1, y1, x2, y2 = box.astype(int) w = x2 - x1 h = y2 - y1 # Проверка границ изображения x1, y1 = max(0, x1), max(0, y1) x2, y2 = min(color_image.shape[1], x2), min(color_image.shape[0], y2) # Получение средней глубины в области бокса depth_roi = depth_image[y1:y2, x1:x2] depth_roi = depth_roi.astype(float) depth_scale = depth_frame.get_units() depth_value = depth_roi.mean() * depth_scale # В метрах # Обновление массива распознанных объектов recognized_objects.append({ 'box': (x1, y1, x2, y2), 'confidence': confidences[i], 'class_id': class_ids[i], 'depth': depth_value, }) # Отображение результатов cv2.rectangle(color_image, (x1, y1), (x2, y2), (0, 255, 0), 2) label = f"{model.names[class_ids[i]]}: {depth_value:.2f}m" cv2.putText(color_image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (36, 255, 12), 2) # Отображение изображения cv2.imshow('RealSense', color_image) if cv2.waitKey(1) & 0xFF == ord('q'): break # Очистка списка распознанных объектов для следующего кадра recognized_objects.clear() finally: # Остановка потока pipeline.stop() cv2.destroyAllWindows()