OpenCV Python es una biblioteca de enlaces de Python diseñada para resolver problemas de visión artificial. El método cv2.putText () se usa para dibujar una cadena de texto en cualquier imagen.
cv2 puttext
void cv::putText
(
InputOutputArray
img,
const String &
texto,
Punto
org ,
int
fontFace,
double
fontScale,
< /td>
Escalar
color,
int
grosor = 1 ,
int
< td class="paramname">tipo de línea = LINE_8,
bool
bottomLeftOrigin = false
)
Sintaxis: cv2.putText(image, text, org, font, fontScale, color[, thick[, lineType[, bottomLeftOrigin]]]) Parámetros: image : Es la imagen sobre la que se va a dibujar el texto.
texto: Cadena de texto a dibujar.
org: Son las coordenadas de la esquina inferior izquierda de la cadena de texto en la imagen. Las coordenadas se representan como tuplas de dos valores, es decir (valor de la coordenada X, valor de la coordenada Y).
fuente: Denota el tipo de fuente. Algunos tipos de fuente son FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, etc.
fontScale: factor de escala de fuente que se multiplica por el tamaño base específico de la fuente.
color: Es el color de la cadena de texto a dibujar. Para BGR, pasamos una tupla. ej.: (255, 0, 0) para el color azul.
grosor: Es el grosor de la línea en px.
tipo de línea: Este es un parámetro opcional. Da el tipo de línea a utilizar.
bottomLeftOrigin: Este es un parámetro opcional. Cuando es verdadero, el origen de los datos de la imagen está en la esquina inferior izquierda. De lo contrario, se encuentra en la esquina superior izquierda.
Valor devuelto: Devuelve una imagen.
¿Cómo escribir texto en una imagen en Windows usando Python OpenCV2?
Pregunta de StackOverflow
Quiero poner algo de texto en una imagen. Estoy escribiendo el código como:
Da ERROR, diciendo que el objeto `módulo` no tiene atributo `CV_FONT_HERSHEY_SIMPLEX`
Consulta Can` ¿Utilizo el tipo de fuente como se indica arriba? Busqué en Internet, pero solo encontré la sintaxis relacionada con Opencv C++ para initFont. Luego pensé en usar putText para pasar el tipo de fuente como parámetro. Pero no me funciona.
¿Alguna sugerencia?
Respuesta:
Este código usa cv2.putText para superponer texto en una imagen. Necesita tener NumPy y OpenCV instalados.
Escribe texto en el centro de la imagen usando Python cv2.puttext
Si conoces la forma (ancho, alto) del texto que escribes en la imagen, puedes ponerlo en el centro alineado en la imagen.
La forma aproximada del texto en el ejemplo anterior es (268, 36). Es posible que deba encontrar la forma de un texto específico usando Paint o alguna otra aplicación.
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, #matriz numpy en la que se escribe el texto "Ejemplos de Python", #posición del texto, #posición en la que debe comenzar la escritura cv2.FONT_HERSHEY_SIMPLEX, #familia de fuentes 1, #tamaño de fuente (209, 80, 0, 255), #color de fuente 3) #trazo de fuente cv2.imwrite (`output.png`, imagen)
Imagen de salida:
Python OpenCV puttext
putte cv2 xt Ejemplo #
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 = (caja[i][0], caja[i][1]) p2 = (caja[i][2], caja[i][3]) cv2.rectangle(origimg, p1, p2, ( 0,255,0)) p3 = (max(p1[0], 15), max(p1[1], 15)) title = "%s:%.2f" % (COCO_CLASSES[int(cls[i])] , conf[i]) cv2.putText(origimg, título, p3, cv2.FONT_ITALIC, 0.6, (0, 255, 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Salir si se presiona ESC si k == 27: devuelve Falso devuelve Verdadero
cv2.puttext Ejemplo #
def drawBoundingBox(self,imgcv,result): for box in result : # print(caja) x1,y1,x2,y2 = (caja[`arriba a la izquierda`][`x`],caja[`arriba a la izquierda`][`y`],caja[`abajo a la derecha`][`x`] ,box[`bottomright`][`y`]) conf = box[`confidence`] # print(conf) label = box[`label`] if conf < self.predictThresh: continue # print(x1,y1,x2 ,y2,conf, etiqueta) cv2.rectangle(imgcv,(x1,y1),(x2,y2),(0,255,0),6) labelSize=cv2.getTextSize(label,cv2.FONT_HERSHEY_COMPLEX,0.5,2) # print(`labelSize> >`,tamañoetiqueta) _x1 = x1 _y1 = y1#+int(tamañoetiqueta[0][1]/2) _x2 = _x1+tamañoetiqueta[0][0] _y2 = y1-int(tamañoetiqueta[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
def detect( archivo img): origen = cv2.imread(imgfile) img = preprocesar(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 = (caja[i][2], caja[i][3]) cv2.rectangle(origimg, p1, p2, (0,255,0)) p3 = (max(p1[0], 15) , max(p1[1], 15)) título = "%s:%.2f" % (CLASES[int(cls[i])], conf[i]) cv2.putText(origimg, título, p3, cv2 .FONT_ITALIC, 0.6, (0, 255, 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Salir si se presiona ESC si k == 27: return False return True
cv2.puttext Ejemplo #
def draw_boxes_frame(frame, frame_size, boxes_dicts, class_names, input_size): """Dibuja cuadros detectados en un cuadro de video""" boxes_dict = boxes_dicts[ 0] resize_factor = (frame_size[0] / input_size[1], frame_size[1] / input_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) (prueba_ancho, texto_alto), línea de base = cv2.getTextSize(class_names[cls], cv2.FONT_HERSHEY_SIMPLEX, 0.75, 1) cv2.rectangle(frame , (xy[0], xy[1]), (xy[0] + ancho_prueba, xy[1] - altura_texto - línea base), color[::-1], grosor=cv2.LLENADO) cv2.putText(marco , class_names[cls], (xy[0], xy[1] - línea base), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 0), 1)
cv2 puttext Ejemplo #
def ProcessFrame(self, frame): # segment arm region segment = self.SegmentArm(frame) # hacer una copia de la imagen segmentada para dibujar en draw = cv2.cvtColor(segment, cv2.COLOR_GRAY2RGB) # dibujar algo ayudantes para colocar correctamente la mano 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) # encuentra el casco del área segmentada, y en base a eso encuentra el # c defectos de convexidad [contornos, defectos] = self.FindHullDefects(segmento) # detectar el número de dedos en función de los contornos y defectos de convexidad # dibujar defectos que pertenecen a los dedos verdes, otros rojos [sin dedos, dibujar] = self.DetectNumberFingers (contornos, defectos, dibujar) # imprimir el número de dedos en la imagen cv2.putText(dibujar, str(sindedos), (30,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255)) volver dibujar