from disturbs.geometric import *
import numpy as np
[documenti]
def draw_polygon_on_image(img: cv2.typing.MatLike, label: Union[list[str], str]) -> cv2.typing.MatLike:
"""
Questo metodo permette di disegnare il poligono che identifica un oggetto all'interno di un'immagine.
La label deve essere nel seguente formato: (class x_1 y_1 x_2 y_2 ... x_n y_n), ciascuna
coordinata deve essere normalizzata [0, 1].
Parameters:
img: l'immagine a cui aggiungere la label.
label: una label o una lista di label con il seguente formato: (class x_1 y_1 x_2 y_2 ... x_n y_n) da rappresentare nell'immagine.
Returns:
l'immagine con la/le labels
"""
if img is None:
raise ValueError(f"Impossibile caricare l'immagine da: {image_path}")
img_height, img_width = img.shape[:2]
for line in label:
line = line.strip()
if not line:
continue
parts = line.split()
norm_coords = list(map(float, parts[1:]))
if len(norm_coords) % 2 != 0:
print(f"Salto la linea: '{line}' — le coordinate non sono valide.")
continue
points = []
for i in range(0, len(norm_coords), 2):
x_norm = norm_coords[i]
y_norm = norm_coords[i + 1]
x_pixel = int(x_norm * img_width)
y_pixel = int(y_norm * img_height)
points.append((x_pixel, y_pixel))
# se la linea contiene meno di 3 punti non è possibile disegnare un
# poligono
if len(points) < 3:
print(f"Salto la linea: '{line}' — contiene meno di 3 punti.")
continue
pts_array = np.array(points, dtype=np.int32).reshape((-1, 1, 2))
cv2.polylines(
img,
[pts_array],
isClosed=True,
color=(0, 255, 0), # Green
thickness=2
)
return img
[documenti]
def draw_bounding_boxes(img: cv2.typing.MatLike, label: Union[list[str], str]) -> cv2.typing.MatLike:
"""
Questo metodo permette di disegnare le label quadrate o rettangolari all'interno dell'immagine. La label deve essere
contenuta in un file testuale nel seguente formato: (class centro_x centro_y height width) ciascuna
coordinata deve essere normalizzata [0, 1].
Args:
img: l'immagine a cui aggiungere la label
label: una label o una lista di label con il seguente formato: (class centro_x centro_y height width) da rappresentare nell'immagine.
Returns:
l'immagine con la/le label.
"""
h, w = img.shape[:2]
if isinstance(label, str):
with open(label, 'r') as f:
label_lines = f.readlines()
else:
label_lines = label
for line in label_lines:
parts = line.strip().split()
if not parts:
continue
cx, cy, bbox_w, bbox_h = map(float, parts[1:])
x1 = int((cx - bbox_w / 2) * w)
y1 = int((cy - bbox_h / 2) * h)
x2 = int((cx + bbox_w / 2) * w)
y2 = int((cy + bbox_h / 2) * h)
cv2.rectangle(img, (x1, y1), (x2, y2), color=(0, 255, 0), thickness=2)
return img
[documenti]
def plot_label(img: cv2.typing.MatLike, label: Union[list[str], str]) -> cv2.typing.MatLike:
parts = label[0].strip().split()
coords = list(map(float, parts[1:]))
if len(coords) == 4:
return draw_bounding_boxes(img, label)
else:
return draw_polygon_on_image(img, label)
# Example usage with placeholder paths
if __name__ == "__main__":
image_path = "../dataset/BrainTumor/BrainTumorYolov11/test/images/10_jpg.rf.efaf1af26de11dabdda3214f4457c931.jpg"
label_path = "../dataset/BrainTumor/BrainTumorYolov11/test/labels/10_jpg.rf.efaf1af26de11dabdda3214f4457c931.txt"
image = cv2.imread(image_path)
try:
with open(label_path, 'r') as f:
labels = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print(f"Error: File not found at {label_path}")
exit()
rotated_image, rotated_label = rotate_image_and_label(image, labels, 50)
bb = draw_polygon_on_image(rotated_image, rotated_label)
#bb = plot_bounding_boxes(rotated_image, rotated_label)
cv2.imshow("Centro di gravita", bb)
cv2.waitKey(0)