Codice sorgente per utilities.show_labels

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)