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.

91 lines
3.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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()