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.

44 lines
1.8 KiB

import cv2
from ultralytics import YOLO
import numpy as np
class DataProcessor:
def __init__(self, model_path='./../app/models/yolov9e_object_classification.pt'):
self.model = YOLO(model_path)
def __decode_image_from_base64(self, data, color=True):
decoded = base64.b64decode(data)
nparr = np.frombuffer(decoded, np.uint8)
return cv2.imdecode(nparr, cv2.IMREAD_COLOR if color else cv2.IMREAD_GRAYSCALE)
def inline_detection(self, data):
color_matrix = self.__decode_image_from_base64(data['rgb'], color=True)
depth_matrix = self.__decode_image_from_base64(data['depth'], color=False)
if depth_matrix is None or color_matrix is None:
print("Не удалось получить изображения. Проверьте подключение камеры.")
return [], None
results = self.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 = self.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': float(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)
return detections_info, annotated_image