Visión artificial. Tomás Domínguez Mínguez. Читать онлайн. Newlib. NEWLIB.NET

Автор: Tomás Domínguez Mínguez
Издательство: Bookwire
Серия:
Жанр произведения: Математика
Год издания: 0
isbn: 9788426733474
Скачать книгу
esta función, el grosor es un argumento opcional.

      Para practicar con el dibujo de círculos, va a pintar una diana sobre la imagen del cuadro de la niña. Su código es el siguiente:

Illustration Illustration

      Este programa no es difícil de entender. Lo único que sería necesario comentar es que todas las circunferencias con las que se dibuje la diana tendrán como centro el de la propia imagen. De ahí que se utilice el atributo shape para obtener el ancho y alto, ya que el centro de la imagen será el punto:

       (ancho/2, alto/2)

      Puesto que una división devuelve un valor de tipo float y los píxeles de una imagen deben ser números enteros, tendrá que realizarse una operación de casting para obtener las coordenadas x, y del centro de la imagen (centro_x y centro_y).

Illustration

      El bucle for que hay a continuación establece el rango con los valores del radio de la circunferencia que se va a pintar en cada bucle con la función circle().

Illustration

      Observe el resultado obtenido.

Illustration

      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.

Illustration

      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:

Illustration Illustration

      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.

Illustration

      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.

Illustration

      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.

Illustration

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

Illustration

      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

Illustration

      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():

Illustration

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

Illustration

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

Illustration

      Las barras de desplazamiento son