O OpenCV Python é uma biblioteca de links Python projetada para resolver problemas de visão computacional. O método cv2.putText
() é usado para desenhar uma string de texto em qualquer imagem.
cv2 puttext
void cv::putText | ( | InputOutputArray | img, |
Cont String & | texto, | ||
Ponto | org , | ||
int | fontFace, | ||
double | fontScale, | ||
< /td> | Escalar | cor, | |
int | espessura = 1 , | ||
int | < td class="paramname">lineType =|||
bool | bottomLeftOrigin = false | ||
) |
Sintaxe: cv2.putText(imagem, texto, org, fonte, fontScale, cor[, espessura[, lineType[, bottomLeftOrigin]]]) Parâmetros: image : É a imagem na qual o texto deve ser desenhado.
texto: sequência de texto a ser desenhada.
org: São as coordenadas do canto inferior esquerdo da string de texto na imagem. As coordenadas são representadas como tuplas de dois valores, ou seja (valor da coordenada X, valor da coordenada Y).
fonte: Indica o tipo de fonte. Alguns dos tipos de fonte são FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, etc.
fontScale: fator de escala da fonte que é multiplicado pelo tamanho base específico da fonte.
color: É a cor da string de texto a ser desenhada. Para BGR, passamos uma tupla. por exemplo: (255, 0, 0) para cor azul.
espessura: É a espessura da linha em px.
lineType: Este é um parâmetro opcional. Dá o tipo de linha a ser usada.
bottomLeftOrigin: Este é um parâmetro opcional. Quando for verdadeiro, a origem dos dados da imagem está no canto inferior esquerdo. Caso contrário, fica no canto superior esquerdo.
Valor de retorno: retorna uma imagem.
Como escrever texto em uma imagem no Windows usando Python OpenCV2?
Pergunta do StackOverflow
Quero colocar algum texto em uma imagem. Estou escrevendo o código como:
cv2.putText(image,"Hello World!!! ", (x,y), cv2. CV_FONT_HERSHEY_SIMPLEX, 2, 255)
Dá ERROR, dizendo que o objeto `module` não tem atributo `CV_FONT_HERSHEY_SIMPLEX`
Query Can` t Eu uso o tipo de fonte como acima? Procurei na internet, mas encontrei apenas a sintaxe relacionada ao Opencv C++ para initFont. Então pensei em usar putText
para passar o tipo de fonte como parâmetro. Mas não está funcionando para mim.
Alguma sugestão?
Resposta:
Este código usa cv2.putText para sobrepor texto em uma imagem. Você precisa do NumPy e do OpenCV instalados.
import numpy as np import cv2 # Criar uma imagem preta img = np.zeros((512,512,3), np.uint8) # Write some Text font = cv2. FONT_HERSHEY_SIMPLEX bottomLeftCornerOfText = (10,500) fontScale = 1 fontColor = (255,255,255) lineType = 2 cv2.putText(img,`Hello World! `, bottomLeftCornerOfText, font , fontScale, fontColor, lineType) #Exibir a imagem cv2.imshow("img",img) #Salvar imagem cv2.imwrite("out.jpg", img) cv2.waitKey(0)
Escreva texto no centro da imagem usando Python cv2.puttext
Se você conhece a forma (largura , height) do texto que você escreve na imagem, você pode colocá-lo no centro alinhado na imagem.
A forma aproximada do texto no exemplo a acima é (268, 36). Você pode precisar encontrar a forma de um texto específico usando o Paint ou algum outro aplicativo.
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, #numpy array no qual o texto é escrito "Exemplos Python", #posição do texto, #posição na qual a escrita deve começar cv2. FONT_HERSHEY_SIMPLEX, #font family 1, #font size (209, 80, 0, 255), #font color 3) #font stroke cv2.imwrite (`output.png`, imagem)
Imagem de saída:
Python OpenCV puttext
cv2 put Exemplo de texto #
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(origimg, p1, p2, ( 0,255,0)) p3 = (max(p1[0], 15), max(p1[1], 15)) título = "%s:%.2f" % (COCO_CLASSES[int(cls[i])] , conf[i]) cv2.putText(origem, título, p3, cv2. FONT_ITALIC, 0.6, (0, 255, 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Sair se ESC pressionado se k == 27: return False return True
cv2.puttext Exemplo #
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[` trust`] # 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
cv2 puttext Exemplo #
def draw_labels(x, y, class_names=Nenhum): img = x.numpy() if img.ndim == 2 ou img.shape[2] == 1: img = cv2.cvtColor(img, cv2. COLOR_GRAY2BGR), classes = tf.split(y, (4, 1), axis=-1) classes = classes[..., 0] wh = np.flip(img.shape[0:2]) min_wh = np.amin(wh) if min_wh <= 100: font_size = 0.5 else: font_size = 1 for i in range(len(boxes)): x1y1 = tuple((np.array(boxes[i][0:2])) * wh).astype(np.int32)) x2y2 = tupla((np.array(boxes[i][2:4]) * wh).astype(np.int32)) img = cv2.rectangle(img, x1y1 , x2y2, (255, 0, 0), 1) if class_names: img = cv2.putText(img, class_names[classes[i]], x1y1, cv2. FONT_HERSHEY_COMPLEX_SMALL, font_size, (0, 0, 255), 1) else: img = cv2.putText(img, str(classes[i]), x1y1, cv2. FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1) return img
cv2.puttext Exemplo #
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]) if img.ndim == 2 ou img.shape[2] == 1: img = cv2.cvtColor(img, cv2. COLOR_GRAY2BGR) min_wh = np.amin(wh) if min_wh <= 100: font_size = 0.5 else: font_size = 1 for i in range(classes.shape[0]): x1y1 = tuple((np.array(boxes[i][0:2]) * wh).astype(np.int32)) x2y2 = tupla((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 Exemplo #
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.retangle(origem, p1, p2, (0,255,0)) p3 = (max(p1[0], 15), max(p1[1], 15 )) título = "%s:%.2f" % (CLASSES[int(cls[i])], conf[i]) cv2.putText(origem, título, p3, cv2. FONT_ITALIC, 0.6, (0, 255 , 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Sair se ESC pressionado se k == 27: return False return True
cv2. Exemplo puttext #
def draw_boxes_frame(frame, frame_size, boxes_dicts, class_names, input_size): """Desenha caixas detectadas em um quadro de vídeo""" boxes_dict = boxes_dicts[0] resize_factor = (frame_size[0] / input_size[1], frame_size[1] / inp ut_size[0]) for cls in range(len(class_names)): boxes = boxes_dict[cls] color = (0, 0, 255) if np.size(boxes) ! = 0: for box in boxes: xy = box[: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], espessura =cv2. PREENCHIDO) cv2.putText(frame, class_names[cls], (xy[0], xy[1] - linha de base), cv2. FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 0), 1)
cv2 puttext Exemplo #
def ProcessFrame(self, frame): # segment arm region segment = self.SegmentArm(frame) # faz uma cópia da imagem segmentada para desenhar em draw = cv2.cvtColor (segmento, cv2. COLOR_GRAY2RGB) # desenha alguns auxiliares para posicionar corretamente a mão 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) # encontra o casco da área segmentada , e com base nisso, encontre os # defeitos de convexidade [contours,defects] = self.FindHullDefects(segment) # detecta o número de dedos dependendo dos contornos e defeitos de convexidade # desenha defeitos que pertencem aos dedos verdes, outros vermelhos [sem dedos, desenhe ] = self.DetectNumberFingers(contornos, defeitos, desenho) # imprime o número de dedos na imagem cv2.putText(desenhar, str(sem dedos), (30,30), cv2. FONT_HERSHEY_SIMPLEX, 1, (255,255,255)) return draw
cv2.puttext Exemplo #
def vis_class(img, pos, class_str, bg_color): """Visualiza a classe."" " font_color = cfg.VIS.SHOW_CLASS.COLOR font_scale = cfg.VIS.SHOW_CLASS.FONT_SCALE x0, y0 = int(pos[0]), int(pos[1]) # Calcula o tamanho do texto. txt = class_str fonte = cv2. FONT_HERSHEY_SIMPLEX ((txt_w, txt_h), _) = cv2.getTextSize(txt, font, font_scale, 1) # Coloca o fundo do texto. 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) # Mostra o texto. 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 Exemplo #
def plot_one_box(x, img, color=Nenhum, label=Nenhum, line_thickness=Nenhum): # Plota uma caixa delimitadora na imagem img tl = line_thickness ou round(0.002 * (img.shape[0] + img. shape[1]) / 2) + 1 # espessura da linha color = color 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, color, espessura=tl) if label: tf = max(tl - 1, 1) # espessura da fonte t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, espessura=tf)[0] c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3 cv2.retangle(img, c1, c2, color, -1) # preenchido cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255 , 255], espessura=tf, tipodelinha=cv2. LINE_AA)
cv2.puttext Exemplo #
def vis_det_and_mask(im, class_name, dets, mask, thresh=0.8): """Depuração visual de detecções.""" 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) # classifica rois de acordo com as coordenadas, desenha a bbox superior primeiro 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 = mask[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], espessura=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), espessura=1) return im