📦 Descubre cómo usar OBB con YOLO – Cajas delimitadoras orientadas paso a paso
¡Hola, hola, Omesitos! En esta ocasión nos introduciremos en una tarea llamada OBB (Oriented Bounding Box) o cuadros delimitadores orientados, la cual lleva a la detección de objetos un paso más allá. Para llevarla a cabo usaremos Ultralytics, ya que nos provee distintos modelos YOLO. Así que, ¡empecemos!
¿Qué es OBB (Oriented Bounding Box) o Cuadros Delimitadores Orientados?

Para entenderlo mejor tendremos que recordar a los cuadros delimitadores en la detección de objetos. Dichos cuadros rodean al objeto detectado, pero no tienen en cuenta su orientación, es allí donde entra OBB, técnica que introduce un ángulo adicional al momento de localizar el objeto, lo que hace que la detección sea mucho más precisa.
🔧 Instalación de Ultralytics
Para llevar a cabo esta práctica debemos instalar Ultralytics, a través de:
pip install ultralytics
Puedes verificar su instalación y versión con: pip freeze
Nota: A continuación te dejo la programación usada en el video. Si quieres ver el paso a paso explicado con más detalle, ¡no te pierdas el video completo!
🖼️Cuadros delimitadores orientados en imágenes con YOLOv11 de Ultralytics
from ultralytics import YOLO # Cargamos el modelo YOLO model = YOLO("yolo11m-obb.pt") # Cargamos la imagen image = "./Inputs/*.jpg" # Realizamos la inferencia de YOLO results = model(image) # Visualizar los resultados for res in results: res.show()
🖼️ Cuadros delimitadores orientados en imágenes leídas con OpenCV con YOLOv11 de Ultralytics
from ultralytics import YOLO import cv2 import numpy as np import imutils # Cargamos la imagen de entrada image = cv2.imread("./Inputs/image_001.jpg") # Cargamos el modelo YOLO model = YOLO("yolo11m-obb.pt") # Realizamos la inferencia sobre la imagen results = model(image) print(results) print('--------------------') print(results[0].obb) # Obtenemos clases detectadas y puntos de OBB (Oriented Bounding Boxes) cls_detected = results[0].obb.cls tensor_points = results[0].obb.xyxyxyxy # Recorremos cada caja delimitadora detectada for tensor_points_obj, cls_obj in zip(tensor_points, cls_detected): # Convertimos el tensor a NumPy points = tensor_points_obj.cpu().numpy().squeeze() # Redimensionamos y convertimos a enteros points = points.reshape((4, 2)).astype(np.int32) print(points) # Dibujamos la caja rotada sobre la imagen cv2.drawContours(image, [points], -1, (0, 255, 0), 2) # Visualizar los puntos del cuadro delimitador for i, (x, y) in enumerate(points): if i == 0: color = (0, 255, 0) # Verde, para x1, y1 #cv2.putText(image, results[0].names[int(cls_obj)], (x, y - 30), 1, 3, (0,255,0), 2) elif i == 1: color = (255, 0, 0) # Rojo, para x2, y2 elif i == 2: color = (0, 0, 255) # Azul, para x3, y3 else: color = (255, 255, 0) # Amarillo, para x4, y4 # Dibujamos el punto en la imagen cv2.circle(image, (x, y), 10, color, -1) # Redimensionamos la imagen image = imutils.resize(image, width=1000) cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows()
🎞️ Cuadros delimitadores orientados en videos con YOLOv11 de Ultralytics
from ultralytics import YOLO import cv2 import imutils # Cargamos el modelo YOLO model = YOLO("yolo11m-obb.pt") # Cargamos el video de entrada video_path = "./Inputs/video_001.mp4" cap = cv2.VideoCapture(video_path) while cap.isOpened(): # Leemos el frame del video ret, frame = cap.read() if not ret: break # Realizamos la inferencia de YOLO sobre el frame results = model(frame) # Extraemos los resultados annotated_frame = results[0].plot() annotated_frame = imutils.resize(annotated_frame, width=1000) # Visualizamos los resultados cv2.imshow("YOLO Inference", annotated_frame) # El ciclo se rompe al presionar "Esc" if cv2.waitKey(1) & 0xFF == 27: break cap.release() cv2.destroyAllWindows()
Y eso ha sido todo por este post, Omesitos.
Espero que les haya resultado útil y que se animen a probar los cuadros delimitadores orientados con los modelos de Ultralytics usando YOLOv11.
📌 No olviden revisar el video si desean ver todo el paso a paso en acción.
¡Nos vemos en el siguiente post!