OpenCV Python est une bibliothèque de liens Python conçue pour résoudre les problèmes de vision par ordinateur. La méthode cv2.putText
() est utilisée pour dessiner une chaîne de texte sur n`importe quelle image.
cv2 puttext
void cv::putText | ( | InputOutputArray | img, |
const String & | texte, | ||
Point | org , | ||
int | fontFace, | ||
double | fontScale, | ||
< /td> | Scalaire | couleur, | |
int | épaisseur = 1 , | ||
int | < td class="paramname">lineType =|||
bool | bottomLeftOrigin = false | ||
) |
Syntaxe : cv2.putText(image, texte, org, police, fontScale, couleur[, épaisseur[, lineType[, bottomLeftOrigin]]]) Paramètres : image : C`est l`image sur laquelle le texte doit être dessiné.
text : Chaîne de texte à dessiner.
org : il s`agit des coordonnées du coin inférieur gauche de la chaîne de texte dans l`image. Les coordonnées sont représentées sous forme de tuples de deux valeurs, c`est-à-dire (valeur de coordonnée X, valeur de coordonnée Y).
police : indique le type de police. Certains des types de police sont FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, , etc.
fontScale : facteur d`échelle de police multiplié par la taille de base spécifique à la police.
color : C`est la couleur de la chaîne de texte à dessiner. Pour BGR, nous passons un tuple. par exemple : (255, 0, 0) pour la couleur bleue.
épaisseur : C`est l`épaisseur de la ligne en px.
lineType : Ceci est un paramètre optionnel. Il donne le type de ligne à utiliser.
bottomLeftOrigin : Ceci est un paramètre optionnel. Lorsqu`il est vrai, l`origine des données d`image se trouve dans le coin inférieur gauche. Sinon, il se trouve dans le coin supérieur gauche.
Valeur de retour : il renvoie une image.
Comment écrire du texte sur une image dans Windows en utilisant Python OpenCV2 ?
Question StackOverflow
Je veux mettre du texte sur une image. J`écris le code comme :
cv2.putText(image,"Bonjour le monde !!! ", (x,y), cv2. CV_FONT_HERSHEY_SIMPLEX, 2, 255)
Il donne ERROR, indiquant que l`objet `module` n`a pas d`attribut `CV_FONT_HERSHEY_SIMPLEX`
Query Can` t J`utilise le type de police comme ci-dessus ? J`ai cherché sur Internet, mais je n`ai trouvé que la syntaxe liée à Opencv C++ pour initFont. Ensuite, j`ai pensé à utiliser putText
pour passer le type de police en paramètre. Mais cela ne fonctionne pas pour moi.
Des suggestions ?
Réponse :
Ce code utilise cv2.putText pour superposer du texte sur une image. Vous devez installer NumPy et OpenCV.
import numpy as np import cv2 # Créer une image noire img = np.zeros((512,512,3), np.uint8) # Écrivez du texte font = cv2. FONT_HERSHEY_SIMPLEX bottomLeftCornerOfText = (10,500) fontScale = 1 fontColor = (255,255,255) lineType = 2 cv2.putText(img,`Hello World ! `, bottomLeftCornerOfText, police , fontScale, fontColor, lineType) #Afficher l`image cv2.imshow("img",img) #Enregistrer l`image cv2.imwrite("out.jpg", img) cv2.waitKey(0)
Écrivez du texte au centre de l`image en utilisant Python cv2.puttext
Si vous connaissez la forme (largeur , hauteur) du texte que vous écrivez sur l`image, vous pouvez le mettre au centre aligné sur l`image.
La forme approximative du texte dans l`exemple a ci-dessus est (268, 36). Vous devrez peut-être trouver la forme d`un texte spécifique à l`aide de Paint ou d`une autre application.
import numpy as np import cv2 image = cv2.imread(`sample.png`,cv2. IMREAD_UNCHANGED) position = ( (int) (image.shape[1]/2 - 268/2), (int) (image.shape[0]/2 - 36/2)) cv2.putText( image, tableau #numpy sur lequel le texte est écrit "Exemples Python", # position du texte, # position à laquelle l`écriture doit commencer cv2. FONT_HERSHEY_SIMPLEX, # famille de polices 1, # taille de police (209, 80, 0, 255), # couleur de police 3) # trait de police cv2.imwrite (`output.png`, image)
Image de sortie :
Python OpenCV puttext
cv2 mettre text Exemple #
def detect(imgfile): origimg = cv2.imread(imgfile) img = preprocess(origimg) img = img.astype(np.float32) img = img.transpose((2, 0 , 1)) net.blobs[`data`].data[...] = img out = net.forward() box, conf, cls = postprocess(origimg, out) for i in range(len(box)) : p1 = (boite[i][0], boite[i][1]) p2 = (boite[i][2], boite[i][3]) cv2.rectangle(origine, p1, p2, ( 0,255,0)) p3 = (max(p1[0], 15), max(p1[1], 15)) titre = "%s:%.2f" % (COCO_CLASSES[int(cls[i])] , conf[i]) cv2.putText(origine, titre, p3, cv2. FONT_ITALIC, 0.6, (0, 255, 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Sortie si ESC appuyé si k == 27 : return False return True
cv2.puttext Exemple #
def drawBoundingBox(self,imgcv,result): for box in result: # print(box) x1,y1,x2,y2 = (box[` topleft`][`x`],box[`topleft`][`y`],box[`bottomright`][`x`],box[`bottomright`][`y`]) conf = box[` confiance`] # print(conf) label = box[`label`] if conf < self.predictThresh: continue # print(x1,y1,x2,y2,conf,label) cv2.rectangle(imgcv,(x1,y1) ,(x2,y2),(0,255,0),6) labelSize=cv2.getTextSize(label,cv2. FONT_HERSHEY_COMPLEX,0.5,2) # print(`labelSize>>`,labelSize) _x1 = x1 _y1 = y1#+ int(labelSize[0][1]/2) _x2 = _x1+labelSize[0][0] _y2 = y1-int(labelSize[0][1]) cv2.rectangle(imgcv,(_x1,_y1),( _x2,_y2),(0,255,0),cv2.FILLED) cv2.putText(imgcv,label,(x1,y1),cv2.FONT_HERSHEY_COMPLEX,0.5,(0,0,0),1) return imgcv
exemple de puttext cv2 #
def draw_labels(x, y, class_names=None) : img = x.numpy() if img.ndim == 2 ou img.shape[2] == 1 : img = cv2.cvtColor(img, cv2. COLOR_GRAY2BGR) boîtes, classes = tf.split(y, (4, 1), axe=-1) classes = classes[..., 0] wh = np.flip(img.shape[0:2]) min_wh = np.amin(wh) si min_wh <= 100 : font_size = 0.5 sinon : font_size = 1 for i in range(len(boxes)) : x1y1 = tuple((np.array(boxes[i][0:2]) * wh).astype(np.int32)) x2y2 = tuple((np.array(boxes[i][2:4]) * wh).astype(np.int32)) img = cv2.rectangle(img, x1y1 , x2y2, (255, 0, 0), 1) si class_names : img = cv2.putText(img, class_names[classes[i]], x1y1, cv2. FONT_HERSHEY_COMPLEX_SMALL, font_size, (0, 0, 255), 1) sinon : img = cv2.putText(img, str(classes[i]), x1y1, cv2. FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1) return img
cv2.puttext Example #
def draw_outputs(img, outputs, class_names=None): boxes, objectness, classes = outputs #boxes, objectness, classes = boxes[0], objectness[0], classes[0] wh = np .flip(img.shape[0:2]) si img.ndim == 2 ou img.shape[2] == 1 : img = cv2.cvtColor(img, cv2. COLOR_GRAY2BGR) min_wh = np.amin(wh) si min_wh <= 100 : font_size = 0.5 sinon : font_size = 1 for i in range(classes.shape[0]): x1y1 = tuple((np.array(boxes[i][0:2]) * wh).astype(np.int32)) x2y2 = tuple((np.array(boxes[i][2:4]) * wh).astype(np.int32)) img = cv2.rectangle(img, x1y1, x2y2, (255, 0, 0), 1) img = cv2.putText(img, `{}`.format(int(classes[i])), x1y1, cv2. FONT_HERSHEY_COMPLEX_SMALL, font_size, (0, 0, 255), 1) return img
cv2 puttext Example #
def detect(imgfile): origimg = cv2.imread(imgfile) img = preprocess(origimg) img = img.astype(np.float32) img = img.transpose((2, 0, 1)) net.blobs[`data`].data[...] = img out = net.forward () box, conf, cls = postprocess(origimg, out) for i in range(len(box)): p1 = (box[i][0], box[i][1]) p2 = (box[i ][2], box[i][3]) cv2.rectangle(origine, p1, p2, (0,255,0)) p3 = (max(p1[0], 15), max(p1[1], 15 )) title = "%s:%.2f" % (CLASSES[int(cls[i])], conf[i]) cv2.putText(origimg, title, p3, cv2. FONT_ITALIC, 0.6, (0, 255 , 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Sortie si ESC appuyé si k == 27 : renvoie Faux renvoie Vrai
cv2. puttext Example #
def draw_boxes_frame(frame, frame_size, boxes_dicts, class_names, input_size): """Dessine les boîtes détectées dans une image vidéo""" boxes_dict = boxes_dicts[0] resize_factor = (frame_size[0] / taille_entrée[1], taille_cadre[1] / entrée ut_size[0]) for cls in range(len(class_names)): boxes = boxes_dict[cls] color = (0, 0, 255) if np.size(boxes) ! = 0 : pour boîte dans boîtes : xy = boîte[:4] xy = [int(xy[i] * resize_factor[i % 2]) for i in range(4)] cv2.rectangle(frame, (xy[0 ], xy[1]), (xy[2], xy[3]), color[::-1], 2) (test_width, text_height), baseline = cv2.getTextSize(class_names[cls], cv2. FONT_HERSHEY_SIMPLEX , 0.75, 1) cv2.rectangle(frame, (xy[0], xy[1]), (xy[0] + test_width, xy[1] - text_height - baseline), color[::-1], épaisseur =cv2. FILLED) cv2.putText(frame, class_names[cls], (xy[0], xy[1] - ligne de base), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 0), 1)
cv2 puttext Example #
def ProcessFrame(self, frame): # segment arm region segment = self.SegmentArm(frame) # faire une copie de l`image segmentée à dessiner sur draw = cv2.cvtColor (segment, cv2. COLOR_GRAY2RGB) # dessiner des aides pour placer correctement la main cv2.circle(draw,(self.imgWidth/2,self.imgHeight/2),3,[255,102,0],2) cv2.rectangle(draw , (self.imgWidth/3,self.imgHeight/3), (self.imgWidth*2/3, self.imgHeight*2/3), [255,102,0],2) # trouve l`enveloppe de la zone segmentée , et sur cette base trouver les # défauts de convexité [contours, défauts] = self.FindHullDefects(segment) # détecter le nombre de doigts en fonction des contours et des défauts de convexité # dessiner les défauts qui appartiennent aux doigts verts, les autres rouges [nofingers, draw ] = self.DetectNumberFingers(contours, defauts, draw) # affiche le nombre de doigts sur l`image cv2.putText(draw, str(nofingers), (30,30), cv2. FONT_HERSHEY_SIMPLEX, 1, (255,255,255)) return draw
cv2.puttext Example #
def vis_class(img, pos, class_str, bg_color): """Visualise la classe."" " font_color = cfg.VIS.SHOW_CLASS.COLOR font_scale = cfg.VIS.SHOW_CLASS.FONT_SCALE x0, y0 = int(pos[0]), int(pos[1]) # Calcule la taille du texte. txt = class_str police = cv2. FONT_HERSHEY_SIMPLEX ((txt_w, txt_h), _) = cv2.getTextSize(txt, font, font_scale, 1) # Placer l`arrière-plan du texte. back_tl = x0, y0 - int(1.3 * txt_h) back_br = x0 + txt_w, y0 cv2.rectangle(img, back_tl, back_br, bg_color, -1) # Afficher le texte. txt_tl = x0, y0 - int(0.3 * txt_h) cv2.putText(img, txt, txt_tl, font, font_scale, font_color, lineType=cv2. LINE_AA) return img
cv2 puttext Example #
def plot_one_box(x, img, color=None, label=None, line_thickness=None): # Trace une boîte englobante sur l`image img tl = line_thickness or round(0.002 * (img.shape[0] + img. forme[1]) / 2) + 1 # épaisseur de ligne couleur = couleur ou [random.randint(0, 255) for _ in range(3)] c1, c2 = (int(x[0]), int(x [1])), (int(x[2]), int(x[3])) cv2.rectangle(img, c1, c2, couleur, épaisseur=tl) si étiquette : tf = max(tl - 1, 1) # épaisseur de la police t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thick=tf)[0] c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3 cv2.rectangle(img, c1, c2, color, -1) # rempli cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255 , 255], épaisseur=tf, lineType=cv2. LINE_AA)
cv2.puttext Exemple #
def vis_det_and_mask(im, class_name, dets, masques, thresh=0.8): """Débogage visuel des détections.""" num_dets = np.minimum(10, dets.shape[0]) colors_mask = random_colors(num_dets) colors_bbox = np.round(np.random.rand(num_dets, 3) * 255) # trier les rois en fonction des coordonnées, dessiner la bbox supérieure en premier draw_mask = np.zeros(im.shape[:2], dtype=np.uint8) for i in range(1): bbox = tuple(int(np.round(x)) for x in dets[i,:4 ]) mask = masques[i,:,:] full_mask = unmold_mask(mask, bbox, im.shape) score = dets[i, -1] if score > thresh : word_width = len(class_name) cv2.rectangle(im, bbox[0:2], bbox[2:4], colors_bbox[i], 2) cv2.rectangle(im, bbox[0:2], (bbox[0] + 18 + word_width*8, bbox[1] +15), colors_bbox[i], épaisseur=cv2. FILLED) apply_mask(im, full_mask, draw_mask, colors_mask[i], 0.5) draw_mask += full_mask cv2.putText(im, `%s` % (class_name), ( bbox[0]+5, bbox[1] + 12), cv2.FONT_HERSHEY_PLAIN, 1.0, (255,255,255), épaisseur=1) return im