Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Dessiner des formes sur une image
Quand un algorithme de détection de visages trouve une tête dans une photo, la première chose qu'il fait c'est dessiner un rectangle autour pour te la montrer. Quand un drone de surveillance détecte un objet, il le marque d'une croix sur l'écran de contrôle. Dessiner des formes sur des images, c'est la façon de communiquer visuellement les résultats d'un algorithme.
C'est comme annoter une carte. Tu prends un feutre et tu traces des zones, des lignes, des repères. Sauf qu'ici, ton feutre c'est du code, et ta carte c'est un tableau de pixels.
En pratique, tu utiliserais cv2.rectangle(), cv2.circle() et cv2.line() pour dessiner rapidement. Mais sous le capot, ces fonctions ne font que modifier les valeurs des pixels dans l'array NumPy. On va le faire nous-mêmes pour bien comprendre ce qui se passe vraiment.
Pour dessiner un rectangle, il suffit de modifier les pixels entre deux coins. Si ton rectangle va du coin (y1, x1) au coin (y2, x2), tu modifies tous les pixels dans cette zone :
image[y1:y2, x1:x2] = [b, g, r]
C'est du slicing NumPy 2D : on sélectionne les lignes de y1 à y2 et les colonnes de x1 à x2.
Pour dessiner une ligne horizontale sur la ligne y, de la colonne x1 à x2 :
image[y, x1:x2] = [b, g, r]
Écris trois fonctions :
dessiner_rectangle(image, y1, x1, y2, x2, couleur) qui remplit le rectangle entre les deux coins avec la couleur BGR donnée (un tuple ou une liste de 3 valeurs). Renvoie l'image modifiée.
dessiner_ligne_horizontale(image, y, x1, x2, couleur) qui dessine une ligne horizontale d'un pixel d'épaisseur. Renvoie l'image modifiée.
dessiner_croix(image, cy, cx, taille, couleur) qui dessine une croix centrée sur (cy, cx). La croix est composée d'une ligne horizontale et d'une ligne verticale, chacune de longueur 2 * taille + 1. Renvoie l'image modifiée.
Exemple : img = np.zeros((100, 100, 3), dtype=np.uint8) dessiner_rectangle(img, 10, 10, 50, 50, [0, 0, 255]) Le rectangle rouge remplit la zone de (10,10) à (50,50)
Ce que tu devrais voir sur ta machine : un rectangle rouge sur fond noir, une ligne colorée, et une croix.
Tests (5/5)
Rectangle remplit la zone
import numpy as np
img = np.zeros((20, 20, 3), dtype=np.uint8)
dessiner_rectangle(img, 5, 5, 15, 15, [255, 0, 0])
assert list(img[10, 10]) == [255, 0, 0], 'Le centre du rectangle doit etre colore'
assert list(img[0, 0]) == [0, 0, 0], 'En dehors du rectangle doit rester noir'
Ligne horizontale
import numpy as np
img = np.zeros((10, 20, 3), dtype=np.uint8)
dessiner_ligne_horizontale(img, 5, 2, 18, [0, 255, 0])
assert list(img[5, 10]) == [0, 255, 0], 'Le pixel sur la ligne doit etre colore'
assert list(img[4, 10]) == [0, 0, 0], 'Au dessus de la ligne doit rester noir'
Croix au centre
import numpy as np
img = np.zeros((20, 20, 3), dtype=np.uint8)
dessiner_croix(img, 10, 10, 3, [0, 0, 255])
assert list(img[10, 10]) == [0, 0, 255], 'Le centre de la croix doit etre colore'
assert list(img[10, 12]) == [0, 0, 255], 'La branche horizontale'
assert list(img[8, 10]) == [0, 0, 255], 'La branche verticale'
Croix ne dépasse pas les bords
import numpy as np
img = np.zeros((10, 10, 3), dtype=np.uint8)
dessiner_croix(img, 0, 0, 5, [255, 255, 255])
assert img.shape == (10, 10, 3), 'La forme ne doit pas changer'
assert list(img[0, 0]) == [255, 255, 255]
Rectangle renvoie l'image
import numpy as np
img = np.zeros((10, 10, 3), dtype=np.uint8)
result = dessiner_rectangle(img, 0, 0, 5, 5, [128, 128, 128])
assert result is not None, 'La fonction doit renvoyer l image'
assert result.shape == (10, 10, 3)