> Modules non standards > OpenCV > Dessin de formes
Dessin de formes
On peut dessiner sous OpenCV. Mais,
attention :
- toutes les coordonnées sont sous la forme (x, y), x sur l'axe horizontal et y sur l'axe vertical vers le base, avec une origine en haut à gauche de l'image.
- les couleurs sont toujours sout la forme (B, G, R) comme d'habitude sous OpenCV (et non (R, G, B)).
Traçage d'une ligne :
- cv2.line(img, (0, 0), (264, 100), (0, 0, 255)) : traçage d'une ligne entre le point (0, 0) et le point (264, 100).
- attention : les coordonnées sont (x, y), avec l'origine en haut à gauche (donc dans l'ordre inverse qui est donné par img.shape !).
- on peut donner une couleur, ici (0, 0, 255), toujours en B, G, R !
- cv2.line(img, (0, 0), (264, 100), (0, 0, 255), 4) : on peut donner l'épaisseur du trait, ici 4.
- si toute une collection de traits à tracer, préferer utiliser cv2.polylines, c'est plus efficace.
Traçage d'un rectangle :
- cv2.rectangle(img, (110, 200), (200, 250), (255, 0, 0), 1) : traçage d'un rectangle en donnant le point en haut à gauche et le point en bas à droite, avec la couleur et l'épaisseur du trait.
- on peut remplir le rectangle en donnant comme épaisseur de trait -1 : cv2.rectangle(img, (110, 200), (200, 250), (255, 0, 0), -1).
Traçage d'un cercle :
- cv2.circle(img, (180, 130), 20, (0, 255, 0), 1) : traçage d'un cercle en donnant le centre, le rayon, la couleur et l'épaisseur de trait.
- on peut indiquer que l'on veut remplir le cercle en mettant une épaisseur de trait négative : cv2.circle(img, (180, 130), 20, (0, 255, 0), -1)
Traçage d'une ellipse (qui peut être partielle) :
- cv2.ellipse(img, (250, 180), (30, 10), 30, 90, 360, (255, 0, 255), 1) : on donne le centre, le (rayon du grand axe, rayon du petit axe), l'angle en degrés que fait le grand axe à partir de l'horizontal et dans le sens des aiguilles d'une montre, les angles de début et de fin (à partir de l'horizontal, et dans le sens des aiguilles d'une montre), la couleur et l'épaisseur du trait.
- on peut indiquer que l'on veut remplir l'ellipse en mettant une épaisseur de trait négative : cv2.ellipse(img, (250, 180), (30, 10), 30, 90, 360, (255, 0, 255), -1).
Traçage d'un polyône :
- attention : il faut donner les points sous forme d'array numpy n x 1 x 2 si n points.
- construire une array de la liste de points, puis faire un reshape dessus pour l'avoir au bon format.
points = numpy.array([[200, 25], [240, 50], [270, 90], [270, 50]], numpy.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(newImg, [points], False, (100, 100, 100), 1)
(100, 100, 100) est la couleur, et 1 est l'épaisseur du trait.
- on peut donner une liste de tels points n x 1 x 2 (très utile si on veut tracer une collection de lignes par exemple).
- donner True au lieu de False pour fermer le polyône.
Exemple de traçage de formes :
import numpy
newImg = 255 * numpy.ones((274, 365, 3), numpy.uint8)
cv2.rectangle(newImg, (10, 100), (100, 150), (0, 255, 255), -1)
cv2.rectangle(newImg, (110, 200), (200, 250), (255, 0, 0), 1)
cv2.circle(newImg, (180, 130), 20, (0, 255, 0), -1)
cv2.ellipse(newImg, (250, 180), (30, 10), 30, 90, 360, (255, 0, 255), -1)
cv2.line(newImg, (0, 0), (264, 100), (0, 0, 255), 4)
points = numpy.array([[200, 25], [240, 50], [270, 90], [270, 50]], numpy.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(newImg, [points, points + 80], True, (100, 100, 100), 2)
cv2.putText(newImg, 'texte', (10, 200), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 125, 0), 1)
Traçage de texte :
- cv2.putText(img, 'texte', (10, 200), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 125, 0)) : on donne l'origine du texte qui est le point en bas à gauche du texte (l'origine de l'image étant toujours en haut à gauche), la police de caractères, la taille relative et la couleur.
- on peut indiquer une épaisseur de trait (ici, 2) : cv2.putText(img, 'texte', (10, 200), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 125, 0), 2).
Exemple montrant les possibilités de polices :
import numpy
newImg = 255 * numpy.ones((274, 365, 3), numpy.uint8)
cv2.putText(newImg, 'Font_Hershey_Plain', (10, 20), cv2.FONT_HERSHEY_PLAIN,
1, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Complex', (10, 40), cv2.FONT_HERSHEY_COMPLEX,
0.5, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Complex_Small', (10, 60), cv2.FONT_HERSHEY_COMPLEX_SMALL,
0.8, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Duplex', (10, 80), cv2.FONT_HERSHEY_DUPLEX,
0.5, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Plain', (10, 100), cv2.FONT_HERSHEY_PLAIN,
1, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Script_Complex', (10, 120), cv2.FONT_HERSHEY_SCRIPT_COMPLEX,
0.5, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Script_Simplex', (10, 140), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
0.5, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Simplex', (10, 160), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 125, 0), 1)
cv2.putText(newImg, 'Font_Hershey_Triplex', (10, 180), cv2.FONT_HERSHEY_TRIPLEX, 0.5, (0, 125, 0),
1)
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert