Introducción a OpenCV con Python

Autores: Fabrizio Gilio y Camila Vives

Tecnologías: Python - OpenCV

Índice

Table of contents generated with markdown-toc

¿Qué es OpenCV?

OpenCV (Open Source Computer Vision Library) es una librería de código abierto multiplataforma, construida con el objetivo de proveer una infraestructura común para aplicaciones de visión artificial, y para acelerar el uso de machine perception en productos comerciales.

La visión artificial (también conocida como computer vision), se trata de una disciplina que provee métodos para adquirir, procesar, analizar y comprender imágenes del mundo real. De esta manera, la visión artificial intenta reproducir en las computadoras la forma en la que los humanos vemos el mundo que nos rodea.

El machine perception es entonces, la capacidad de un sistema de computación de interpretar los datos que se obtienen a través de computer vision, computer audition, machine touch o machine olfaction. El objetivo final de este campo es que la interpretación sea similar a la forma en la que los humanos usan sus sentidos para ver el mundo que los rodea.

Usos de OpenCV

La visión artificial se puede utilizar para un sinfin de aplicaciones que pueden tanto mejorar la eficiencia de las personas en sus trabajos, como crear nuevas formas de observar situaciones y obtener rápidas mediciones que puedan ayudar a resolver problemas. A continuación se nombrarán algunos ejemplos de proyectos en los que se utiliza OpenCV como base para lograr los objetivos de visión artificial.

Deportes

La idea de realizar un seguimiento de los deportistas dentro del campo de juego suele ser muy útil para obtener especificaciones de su rendimiento, ya sea individualmente o en equipo. Con el uso de OpenCV se pueden pensar varios objetivos de visión artificial a lograr, entre ellos:

  • El seguimiento de los jugadores por equipo, para evaluar por ejemplo, el nivel de esfuerzo físico, la velocidad de reacción, la cantidad de pases, etc.
  • La representación de la cancha en tiempo real, lo cual permite crear estrategias de juego, de acuerdo a la posición de los jugadores y sus rivales.
  • La detección de acciones de juego etiquetando cada movimiento, de forma que se puedan obtener estadísticas de cantidad de tiros, tiros sin aciertos o pases dados, entre otras medidas.
  • El Análisis del movimiento corporal, que es útil para deportes en los cuales existen riesgos de sufrir lesiones por un movimiento mal realizado.
Fuente: blogs.nvidia.com

Medicina

En el área de Medicina, la visión artificial se puede utilizar a través de la funcionalidad de detección de objetos, formas y colores, para analizar casos médicos que conlleven cierta complejidad. Por ejemplo, en un Paper publicado por World Journal of Engineering Research and Technology India, se realizó un estudio del uso de OpenCV para la ayuda en la detección de la posición y área de tumores cerebrales.

Ghule, Pournima, "Content-Based Image Retreival for Detecting Brain Tumors and Amyloid Fluid Presence" (2014). Technical Library. 194.

En el trabajo publicado, se explica que las tomografías y resonancias magnéticas producen una imagen completa del cerebro, que por lo general, es analizada visualmente por el médico. Sin embargo, este método tiene un resultado menos preciso en la detección y el tamaño del tumor. Al utilizar en un método asistido por computadora y un sistema integrado para la detección de tejido tumoral cerebral, aumenta la precisión en comparación con otras detecciones. Además se tiene la ventaja de que se reduce el tiempo de análisis para la detección del tumor.

Tráfico

La visión artificial puede ser muy útil tanto para el tráfico vehicular como el tráfico peatonal. Tal como en las aplicaciones anteriores, su utilidad se basa especialmente en la obtención de métricas que permitan sacar conclusiones estadísticas.

En cuanto al tránsito de vehículos, una de las aplicaciones de OpenCV se basa en el control del flujo de tránsito. Es decir, detectar la cantidad de autos que se encuentran circulando y clasificarlos según distintas características como tipo, dirección en la que circulan, color o modelo para luego tomar decisiones sobre esa información. Además el mismo sistema de detección podría utilizarse para calcular la velocidad a la que transitan, de forma que se puedan descubrir infracciones o casos en los que haya vehículos detenidos en medio de la calle. Agregado a esto, si existieran infracciones, OpenCV podría utilizarse también para reconocer la patente y registrarla.

Fuente VisionIntelligence.ai

Al igual que con el tránsito vehicular, se puede hacer un análisis del flujo del tráfico de peatones. En un proyecto desarrollado por la empresa Placemeter, se utilizaba visión artificial para rastrear el movimiento de las calles de Nueva York, de forma que los locales de venta pudieran tener estadísticas de cuántos peatones pasaban por delante de sus tiendas e incluso cuántos ingresaban a ellas.

Reconocimiento facial

Por último, pero quizás de lo más interesante, OpenCV nos permite hacer uso del reconocimiento facial. Es decir, no sólo se reconoce que hay una persona en la imagen, sino que podemos decir quién es esa persona.Esto tiene una amplia variedad de usos, entre los cuales se pueden nombrar el permitir acceso o no a ciertos lugares, la toma de asistencia en ámbitos académicos o empresariales, o el inicio sesión en alguna cuenta de un dispositivo, entre otras.

Adrian Rosebrock en pyimagesearch

A modo de ejemplo, en los aeropuertos de China existen puestos de “ayuda” (al día de hoy incluso algunos son robots que circulan por el establecimiento), que a partir del reconocimiento del rostro de la persona, permite informarle cuál es su vuelo, el horario y la puerta de abordaje. Además, en otros países como Estados Unidos o España también se utiliza el reconocimiento facial para hacer el check-in.

Fuente: Global News

Proceso de instalación

Windows

La forma más simple de instalar la librería OpenCV en Windows es a través de un wrapper package (no oficial) construido con paquetes pre-compilados para Python, usando la herramienta pip.

El proceso es entonces el siguiente:

  1. En primer lugar, comprobamos que la versión de Python es mayor a 3.6.X (Septiembre de 2021) con python -V o python --version
  2. (Opcional) Creamos un entorno virtual con python -m venv [nombre_entorno] y lo activamos con [nombre_entorno]\Scripts\activate.bat Esto sirve para que no colisionen las dependencias de paquetes y las versiones y además para ver qué otros paquetes instala OpenCV
  3. Para ver los paquetes del entorno utilizamos pip list
  4. Instalamos OpenCV con el comando pip install opencv-python. OpenCV requiere de la librería numpy, por eso la va a instalar automáticamente
  5. Verificamos los nuevos paquetes instalados, utilizando nuevamente pip list
  6. Comprobamos que se haya instalado correctamente: iniciamos la consola de python con el comando python, importamos OpenCV con import cv2 as cv e imprimimos la versión con print(cv.__version__)
  7. (Recomendado) Instalar la librería matplotlib a través de pip install matplotlib. Este paso no es obligatorio, pero muchas de las funciones que se usan en OpenCV se pueden simplificar usando funciones de esa librería

Ubuntu

De la misma forma que en Windows, OpenCV puede ser instalado en Ubuntu a partir de paquetes pre-compilados.

Para instalarlo, utilizamos el siguiente comando en la terminal (como usuario root):

$ sudo apt-get install python3-opencv
                          

Luego, abrimos el IDLE de Python y comprobamos que se haya instalado correctamente:

import cv2 as cv
                          print(cv.__version__)
                          

Si el resultado de la version actual se imprime sin ningún error, quiere decir que se ha instalado correctamente.

Fedora

Para el sistema operativo Fedora, los paquetes pre-compilados de OpenCV se instalan a través del siguiente comando:

$ yum install numpy opencv*
                          

Luego, abrimos el IDLE de Python y comprobamos que se haya instalado correctamente:

>>> import cv2 as cv
                          >>> print(cv.__version__)
                          

Si el resultado de la version actual se imprime sin ningún error, quiere decir que se ha instalado correctamente.

Procesamiento de imágenes

¿Qué es una imagen digital?

Antes de comenzar a hablar de procesamiento de imágenes, debemos saber exactamente qué es una imagen digital. Existen múltiples formas de obtener imágenes digitales: sacando una foto con un smartphone, creándola con alguna herramienta de software, escaneándola, o bien, a través de procesos más complejos como lo pueden ser las tomografías computadas o las resonancias magnéticas.

De cualquier forma, mientras nosotros (los humanos) vemos una representación gráfica, los dispositivos que capturan la imagen la almacenan como una gran matriz de dos dimensiones, formada por valores numéricos que representan cada uno de los puntos que se encuentran en ella. Los elementos que conforman la matriz son llamados Picture Elements, Image Elements, o simplemente Pixels.

Fuente: OpenCV

A modo de ejemplo, en la imagen de arriba se puede ver que el espejo del auto no es más que una matriz que contiene el nivel de intensidad de cada pixel.

Almacenamiento de Pixels

La forma de almacenar los pixels varía según las necesidades del problema que se quiera resolver. Como se mencionó anteriormente, cada uno de ellos contendrá el color o la intensidad de color de la imagen.

En el caso de las imagenes que se encuentran en escala de grises (grayscale), el color final se logra a través de un sólo valor por pixel que indica la información de intensidad, o dicho de otra manera, la cantidad de luz que contiene cada elemento de la imagen. Por lo tanto, los únicos colores que serán visibles son el blanco y el negro, teniendo como opción la combinación de ellos para permitirnos crear distintas tonalidades de gris.

Ricardo Cancho Niemietz, Public domain, via Wikimedia Commons

Por otro lado, para poder obtener imágenes a color, existen diferentes métodos, donde cada uno de ellos divide los pixels en tres o cuatro componentes básicos. De esta forma, para representar al color que contendrá cada pixel, en lugar de contar con una sola matriz bidimensional, se tiene una colección de tres o cuatro matrices bidimensionales las cuales a su vez contienen valores numéricos que indican la intensidad.

RGB

El más popular de los métodos es el RGB dado que esa es la forma en la que nuestros ojos construyen los colores. En este caso particular, los componentes básicos son rojo, verde y azul y en ocasiones se agrega un cuarto elemento (alpha) que es la transparencia.

Fuente: e2eml.school

Cada una de las matrices que representan a los elementos rojo, verde y azul se llaman canales. Si la imagen RGB es de 24 bits (estándar actual), cada canal tiene 8 bits. Esto quiere decir que la imagen final está compuesta de tres imágenes, una por cada canal, donde cada sub-imagen puede almacenar pixels discretos con una intensidad medida con valores numéricos en el rango de 0 y 255.

© Nevit Dilmen, CC BY-SA 3.0, via Wikimedia Commons

Esto quiere decir que partiendo de las tres imágenes en escala de grises de los canales, se puede construir una imagen a color. Por ejemplo, en la figura superior, la columna de la derecha muestra los canales aislados en escalas de grises, mientras que en la columna de la izquierda se encuentran su equivalencia en colores naturales. Por último se muestra la combinación de dichas sub-imagenes.

Algo que es importante mencionar es que la operación inversa también es posible: a partir de la imagen a color, se pueden obtener las imágenes en escala de grises de cada uno de los canales. Si se manejan los canales (tanto separados como en conjunto) con diferentes técnicas, se consiguen distintos resultados de efectos artisticos, los cuales son comunmente llamados filtros.

HLS y HSV

El espacio de colores HSL fue inventado en 1938 por Georges Valensi, un ingeniero de telecomunicaciones francés, que lo que buscaba era un método para añadir color a la forma existente de codificación monocrómica utilizada para transmitir video, dado que sólo tenían la componente de luminancia. Con esto, la cadena de televisión emisora podía enviar imágenes a color y los receptores que aún contaban con dispositivos monocromáticos podían recibir "colores" traducidos en blanco y negro, sin modificar las señales transmitidas.

Marvel Studios/Disney Plus

Ahora, volviendo a lo digital, a pesar de que la mayoría de los dispositivos producen colores con la combinación RGB, la relación entre la cantidad de rojo, verde y azul y el color resultante no es intuitiva. Por este motivo, se intentó buscar una forma de representar el color que tenga que ver con la manera en la que los artistas lo creaban, es decir a través de distintas tinturas y sombras. Este tipo de representación del color, llamada HSV, fue creada en los años 70 por el ingeniero norteamericano Alvy Ray Smith, el cual fue uno de los fundadores de PIXAR y de la división de computación en Lucasfilm. Para poder construirlo tomó como base al modelo HSL mencionado anteriormente, y de ahí vienen las similitudes entre ambos.

A diferencia del modelo RGB que es cúbico, los modelos HSV y HLS son cilíndricos. Al ser de esta forma, los colores se definen a través de dimensiones angulares, teniendo en el eje vertical los colores neutros, acromáticos o grises. Tanto la representacion HLS como la HSV incluyen tres canales:

  • Hue (Matiz o Tono), que representa a los colores digitales primarios (rojo, verde, azul) con todos los matices intermedios (naranjas, amarillos, violetas, entre otros).
  • Saturation (Saturación), que indica la “cantidad de color”. Esto quiere decir que el valor mínimo de saturación para cualquier color es el gris, mientras que el máximo es el más “puro” o “intenso”.
  • Value (Valor) en HLS o Lightness (Luminosidad) en HSV, que mide la cantidad de luz. Cualquier color al aumentar su cantidad de luz tiende al blanco y al disminuirla, tiende al negro.
SharkD, CC BY-SA 3.0, via Wikimedia Commons

Como puede verse en la figura, la principal diferencia entre HSV y HSL es que en HSL la saturación va del color puro al gris medio y en HSV la saturación va del color puro al blanco. Por otra parte, la cantidad de luz en HSL va desde el negro al blanco y en HSV va desde el negro al color intenso, el cual representa al color si se lo ilumina con una luz blanca.

Ejemplos

Ejemplo 1 - ¿Dónde está Wally?

¿Dónde está Wally? es una serie de libros para niños creada por el ilustrador inglés Martin Handford. El juego que presentan los libros se basa en encontrar al personaje Wally, que está oculto dentro de una multitud de ilustraciones que representan a cientos de personas, objetos y animales haciendo cosas divertidas.

En este ejemplo intentaremos que el programa escrito en Python con OpenCV, encuentre a Wally en una ilustración completa, teniendo previamente un recorte de lo que debe encontrar. Para esto vamos a proveer al programa con dos imágenes, una del escenario completo, a la cual se le llama Source image (I):

WhereWasWaldo via Imgur

y otra del recorte de Wally en el escenario, la cual es llamada Template image (T):

Para identificar la zona en las que ambas imágenes coinciden, OpenCV compara la imagen T contra la imagen I desplazándola. Es decir, la matriz de números de la imagen plantilla se compara pixel por pixel con la imagen fuente, y a través de una métrica se calcula que tan "buena" o "mala" es la comparación.

En nuestro ejemplo, una vez que encuentre una comparación satisfactoria, marcará la zona en la que se encuentra Wally con un rectángulo.

Código

Ejemplo 2 - Filtros en Cámara Web

En este segundo ejemplo haremos uso de la cámara web, y aplicaremos distintos filtros a la imagen que se está capturando a tiempo real. Para que puedan verse todos los filtros a la vez crearemos una ventana dividida en cuatro porciones en las que se reproduzca la misma imagen.

El siguiente paso será aplicar filtros que provee OpenCV a tres de las cuatro porciones de la ventana, manteniendo en una la imagen original. En este caso aplicaremos los siguientes filtros:

  1. Desenfoque gaussiano: es un efecto de suavizado, en donde se mezclan ligeramente los colores de los pixels, lo que provoca que la imagen pierda detalle y se vea menos nítida.
  2. Filtro Laplaciano: este filtro destaca las regiones de la imagen que tienen un rápido cambio en sus pixels, lo cual se da generalmente en los bordes de los objetos que se encuentran en la imagen.
  3. Cambio de BGR a RGB: como se vió anteriormente, las imágenes pueden descomponerse en sus canales básicos. OpenCV almacena los pixels de video en formato BGR, es decir que las matrices de azul y rojo se encuentran invertidas. Con este filtro, podremos ver que al convertir la imagen a RGB, el objeto que en este caso es rojo, se verá azul y lo mismo ocurrirá con los tonos intermedios de estos dos colores.

Código

Recursos Adicionales

Referencias