B.A.D. [Parte 2] - OpenCV+RasPi y reconociendo una pelota


Siguiendo con los post de este nuevo proyecto, en este voy a compartir la experiencia con la instalación de OpenCV y cómo reconocer  una pelota de tenis desde el RaspBerry Pi. La instalación de OpenCV fue realmente traumática, es demasiado lenta, pero a partir de allí, todo es una poesía, esta libreria de visión por computador es realmente asombrosa.

Instalar OpenCV

Como es habitual en todo este mundo del Raspberry Pi, es fácil encontrar documentación detallada y exhaustiva sobre como hacer esta instalación, de hecho existe algo que es como "La Biblia de OpenCV" que mantiene toda esta documentación, se llama PyImageSearch, con cientos de recursos dedicados a Visión por Computador y Python. Para la instalación seguí una combinación del manual estándar para la versión 3.3.0 y el manual de optimización:

El manual contiene prácticamente todo lo necesario, aunque es muy generoso en sus tiempos, en mi caso el proceso duró algo más del doble en un RasPi3B. 

Más allá del manual,  al momento de instalar OpenCV 4.5.0 sobre RaspiOS de Agosto 2020 es importante tener en cuenta que no es necesario ejecutar el paso 1: Expandir el sistema de archivos, esta versión hace este proceso en la instalación. Los comandos que usé en la instalación son los siguientes:

La gente de PyImageSearch sugiere cambiar el SWAP Size a 1024 para habilitar al RaspBerry para que compile con todos los núcleos, pero es importante recordar que este cambio hay que revertirlo al terminar porque reduce drásticamente la vida útil de nuestra SD. Para esto debemos buscar el archivo /etc/dphys-swapfile y buscar la variable CONF_SWAPSIZE y modificarla:

Al finalizar, reiniciamos el proceso y empezamos a compilar:

Después de dejar el RasPi por 12 horas para que hiciera su trabajo me di cuenta que la compilación con 4 trabajos ocasionaron que el RasPi se colgara y jamás iba a terminar, entonces decidí parar el proceso y reiniciarlo con sólo 2 jobs. Con esta configuración reanudó la compilación de los faltantes (en teoría los 4 jobs hicieron el trabajo mas largo, y el final se hizo sólo con 2), y a partir de allí quedaba únicamente instalar:

Al finalizar queda únicamente hacer el enlace de OpenCV con nuestro Python, y aquí es donde encontré el mayor "problema", las instrucciones del manual no coinciden con la estructura de directorios que obtuve en mi instalación 😧, les explico: La gente de PyImageSearch indican que toca generar el symlink así:

Sin embargo, al revisar la carpeta, el archivo cv2.so no se encuentra allí:

En esta versión, se encuentra una carpeta interna:

De modo tal, los comandos se corrigieron así:

Al final sólo queda probar que lo podamos cargar desde nuestro Python:

Probando OpenCV desde Python

Si todo salió bien, se podrá cargar OpenCV desde Python con sólo importar la librería. Para esto también se tomó una referencia de PyImageSearch: Accessing the Raspberry Pi Camera with OpenCV and Python, que contiene todo lo básico para probar nuestra cámara con OpenCV, el código usado fue este:

Y el resultado es lo esperado:


Máscaras

Las máscaras de imágenes son actividades de procesamiento que buscan esconder porciones de una imagen dependiendo de algún cálculo sobre la misma imagen, y es la técnica que se usa para realizar identificación de cosas en los videos y las fotos, el detalle se escapa de este blog, pero se puede consultar en Wikipedia: Mask (computing).

Para todo el tema de reconocer los colores, y luego reconocer la pelota, seguí lo desarrollado en un Instructable: Automatic Vision Object Tracking, que está supremamente completo y  muy detallado. El código para probar es este:

Y el resultado:

En ese instructable hablan mucho de colores RGB y HSV, yo realmente usé la técnica del instructable: Usar PowerPoint y usar el código que hace la transformación:

Pero evidentemente hay maneras más elegantes. Si se quiere profundizar en esto, en Wikipedia hay artículos tanto de RGB como de HSV.

Detectando la pelota

Ya con los pasos previos ejecutados, y sabiendo que podemos tomar video y hacer cálculos para buscar un color en específico, sólo queda buscar la pelota 😜. Aca nuevamente me basé en el Instructable Automatic Vision Object Tracking y en PyImageSearch Ball Tracking with OpenCV. Debo indicar que ambos recomiendan usar una librería desarrollada por estos últimos: imutils, pero en las pruebas que realice encontré que con la funcion de VideoStream de esta el RasPi se recalentaba más rápido que con la aproximación inicial de RAW, el código que me generaba el recalentamiento prematuro es este:

En mis cálculos, toma alrededor de 6 minutos que se recaliente el RasPi y empiece a sacar el ícono que señala temperaturas de operación de más de 80°C:

Para quienes no conocen los íconos de RasPi, se pueden encontrar acá. Los íconos aparecen en la parte superior derecha de la pantalla:


Usando el código anterior y agregando únicamente las funciones de imutils para detectar bordes encontré un mejor desempeño desde el punto de vista térmico, el código usado es este:

Y haciendo pruebas subía hasta 73°C y luego parecía estabilizarse allí:


Con ambos algoritmos, el resultado es el mismo:


Todo esto se basa en la detección de bordes sobre la máscara que demarca la pelotica, para más información se puede consultar Wikipedia: Edge Detection. Para finalizar, agregue un código para llevar la posición (X, Y) de la pelotica en la pantalla, que seguro será muy útil más adelante:

El resultado es este:

Espero en algún momento le sea muy útil a alguien más.

Comentarios

Entradas más populares de este blog

Proteger entradas en Blogger

Poema Árabe bellísimo

Y llegó Ubuntu 9.10 Karmic Koala