|
|
from Neko.RealSense import RealSenseController
|
|
|
import cv2
|
|
|
from ultralytics import YOLO
|
|
|
import numpy as np
|
|
|
|
|
|
controller = RealSenseController()
|
|
|
|
|
|
def inline_detection(controller):
|
|
|
depth_matrix = controller.acquisition.get_depth_image()
|
|
|
color_matrix = controller.acquisition.get_color_image()
|
|
|
|
|
|
if depth_matrix is None or color_matrix is None:
|
|
|
print("Не удалось получить изображения. Проверьте подключение камеры.")
|
|
|
return
|
|
|
|
|
|
model = YOLO('./models/yolov9e_object_classification.pt')
|
|
|
results = model(color_matrix)
|
|
|
|
|
|
annotated_image = results[0].plot()
|
|
|
|
|
|
detections_info = []
|
|
|
|
|
|
for detection in results[0].boxes:
|
|
|
# Извлекаем координаты ограничивающей рамки
|
|
|
x1, y1, x2, y2 = map(int, detection.xyxy[0])
|
|
|
|
|
|
# Извлекаем класс объекта
|
|
|
class_id = int(detection.cls[0])
|
|
|
class_name = model.names[class_id]
|
|
|
|
|
|
# Извлекаем соответствующую область из карты глубины
|
|
|
depth_values = depth_matrix[y1:y2, x1:x2]
|
|
|
|
|
|
# Вычисляем среднее значение глубины
|
|
|
mean_depth = np.mean(depth_values)
|
|
|
|
|
|
# Сохраняем информацию в массив
|
|
|
detections_info.append({
|
|
|
'class_id': class_id,
|
|
|
'class_name': class_name,
|
|
|
'bbox': [x1, y1, x2, y2],
|
|
|
'mean_depth': mean_depth
|
|
|
})
|
|
|
|
|
|
# Наносим информацию на изображение
|
|
|
cv2.putText(annotated_image, f'{class_name} {mean_depth:.2f}m', (x1, y1 - 10),
|
|
|
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
|
|
|
cv2.rectangle(annotated_image, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
|
|
|
|
|
# Сохраняем аннотированное изображение
|
|
|
output_path = './annotated_image.jpg'
|
|
|
cv2.imwrite(output_path, annotated_image)
|
|
|
print(f"Annotated image saved to {output_path}")
|
|
|
|
|
|
# Опционально: выводим массив с информацией
|
|
|
print("Detections info:")
|
|
|
for info in detections_info:
|
|
|
print(info)
|
|
|
|
|
|
inline_detection(controller) |