Читать книгу Visión artificial - Tomás Domínguez Mínguez - Страница 20

4.5 TEXTOS

Оглавление

Para escribir textos sobre una imagen, la función que deberá emplear es:

putText(imagen, texto, posición, fuente, escala, color, grosor)

El primer argumento de esta función es la imagen sobre la que se va a escribir el texto indicado en el segundo argumento. La posición es una tupla que especifica las coordenadas x, y donde empezará a escribirse. La fuente puede ser cualquiera de las identificadas con las siguientes constantes:

• FONT_HERSHEY_SIMPLEX

• FONT_HERSHEY_PLAIN

• FONT_HERSHEY_DUPLEX

• FONT_HERSHEY_COMPLEX

• FONT_HERSHEY_TRIPLEX

• FONT_HERSHEY_COMPLEX_SMALL

• FONT_HERSHEY_SCRIPT_SIMPLEX

• FONT_HERSHEY_SCRIPT_COMPLEX

• FONT_ITALIC

Las seis primeras fuentes son variantes de sans-serif, las dos siguientes simulan una escritura a mano. La última es la cursiva.

Respecto a la escala, este argumento es el factor por el que se multiplicaría el tamaño base de la fuente. Los últimos argumentos son el color y el grosor (opcional) con el que se va a escribir el texto.


Esta función solo admite un pequeño subconjunto de caracteres ASCII, entre los que no se encuentran caracteres especiales como los acentos o la letra ‘ñ’. Para mostrarlos, tendrá que hacer uso de la librería PIL.

En esta última práctica va a mejorar el programa en el que se señalaba a la niña del cuadro con una flecha, para indicar que se trata de Isabel. El código resultante es el siguiente:



De este programa la única sentencia que es necesario explicar es la que escribe el nombre de la niña (“Isabel”) comenzando en la posición (100, 75), con un tipo de letra que simula estar escrita a mano (FONT_HERSHEY_SCRIPT_SIMPLEX). El color y el grosor tanto de la letra como de la flecha son los mismos. El tamaño de letra (escala) es el doble del que tiene originalmente la fuente elegida.

cv2.putText(img, “Isabel”, (100, 75), fuente, escala, color, grosor)

La siguiente imagen muestra el resultado de la ejecución de este programa.


OpenCV no ofrece posibilidades de alineación de texto, pero a veces puede resultar interesante centrarlo en una zona en la que haya algo de interés, por ejemplo, sobre objetos identificados en aplicaciones de realidad aumentada. Para ello, es necesario conocer las dimensiones del texto que se va a mostrar, que podrá obtener con la función:

getTextSize(texto, fuente, escala, grosor)

El resultado devuelto por esta función son dos valores:

• Una tupla con el ancho y alto del texto.

• El número de píxeles que sobresale por debajo de la línea base el punto más bajo de alguna de sus letras.


La línea base de un texto es sobre la que se apoya la mayoría de sus letras. Por debajo se sitúan los trazos descendentes de aquellas como la ‘g’, la ‘p’, etc.


El siguiente programa emplea esta función para centrar, tanto horizontal como verticalmente, el nombre de la niña en la imagen.


La sentencia clave de este programa es aquella en la que se obtiene el ancho y alto del texto que se quiere centrar (en este caso, “Isabel”). Para ello, se usará la función getTextSize() que acaba de conocer, cuyos argumentos de entrada son dicho texto, su fuente, escala y grosor. De la respuesta devuelta solo interesa la tupla en la que se encuentran el ancho y alto de dicho texto (ancho_texto y alto_texto).

(ancho_texto, alto_texto), _ = cv2.getTextSize(“Isabel”, fuente, escala, grosor)

En la siguiente sentencia se obtienen las dimensiones de la imagen, contenidas en su atributo shape.

alto_imagen, ancho_imagen, canales = img.shape


Recuerde que el primer valor devuelto es el alto, no el ancho.

Conocidas las dimensiones del texto y de la imagen, solo queda calcular las coordenadas x, y en las que habrá que situarlo para que quede centrado. Tenga presente que dichas coordenadas deben ser números enteros, de ahí que se realice la operación de casting con la función int():


Por último, se añade el texto a la imagen en las coordenadas calculadas con las sentencias anteriores y se muestra en pantalla.


Ya solo queda comprobar que el resultado obtenido es el esperado.


Visión artificial

Подняться наверх