Práctica
Práctica
En este apartado se presenta al alumno el código de un programa que muestra de forma práctica la teoría explicada, mostrando una forma de implementar la detección de color así como la detección de movimiento tanto con fondo fijo como con fondo variable. Así el alumno podrá ver ejemplos prácticos y sencillos y aprender a modificarlos y usarlos por su cuenta.
Para ello, el alumno debe seguir las siguientes actividades en el orden que se presentan:
Práctica: Introducción
Para empezar con la práctica, el alumno debe descargarse el siguiente fichero, descomprimirlo, y desde consola, en el directorio de descompresión, compilar el programa tecleando make. Con esto debería compilarse el programa sin problemas. Si es así, teclea despues detectarObjetosTest y aparecerá la siguiente ventana:

-
Detección de color. En esta opción el programa permite confgurar un color para detectar en la imagen capturada de la cámara.
-
Detección de movimiento. En esta opción el programa permitirá o bien capturar un fondo fijo y utilizar detección de movimiento usando fondo fijo o bien realizar detección de movimiento usando diferencias de fotogramas consecutivos.
Práctica: Detección de color
En esta parte nos centraremos en la opción del menú de detección de color. Al seleccionar esa opción en el programa, se obtendrá una pantalla similar a ésta:
Concretamente, esa pantalla es la que se obtiene cuando se selecciona la operación de mostrar area de selección. La parte de código correspondiente a esta parte del programa está en el fichero detectarObjetos.cpp, en la función menuDetectarColor (líneas 87 a 117). En esta parte del código se pueden distinguir las tres partes del menu. En primer lugar muestra en la pantalla un recuadro que será donde se podra seleccionar el color a escoger. Para eso poner un objeto, como en la figura, y seleccionar la opción del menú seleccionar color. Tras esto, al escoger detectar color se comenzará a detectar el color indicado en las imágenes capturadas. Lo único que hay que tener en cuenta en el código es que la imagen showImg es una variable global que es la que se muestra en la ventana de OpenCV en la función update. Como se puede observar, la detección de color se hace en HSV, como ya se comentó en la teoría.
Como se puede observar en el código, los pasos para detectar color son los indicados en la teoría:
- Conversión de la imagen a HSV y realizar la diferencia entre la imagen el color que hay que buscar.
- De la imagen diferencia obtenida se binariza (esta parte es la segmentación de la imagen explicada en teoría), poniendo un umbral que permita discernir que parte corresponde realmente al color buscado (255) y cual no (0).
- Por último se hace la operación AND del canal H, S y V (es decir, se comprueba que el color cumple tanto el color como la saturación y el valor) y se suma al canal verde de la imagen que se muestra, razón por la cual se ve verde la zona del color buscado.
Práctica: Detección de movimiento
En esta parte nos centraremos en la opción del menú de detección de movimiento. Al seleccionar esa opción en el programa, se obtendrá una pantalla similar a ésta:
La parte de código correspondiente a esta parte del programa está en el fichero detectarObjetos.cpp, en la función menuDetectarMovimiento (líneas 119 a 147). En esta función, al igual que en el caso anterior, se pueden distinguir las distintas partes de los submenus. En primer lugar, está la opción de capturar fondo, que es la que permite hacer una captura de la imagen actual que se usará como fondo fijo en el caso de detección de movimiento con fondo fijo. Si tras esto, se selecciona la opción de detección de fondo fijo se podrá obtener algo como lo que muestra la siguiente imagen:

Por otro lado, si se selecciona detección de fondo variable, no hará falta la captura de fondo fijo, y se podrá ver un resultado como el de las siguientes imágenes. En la primera se trata de dejar quieto el bolígrafo, por eso se detecta poco movimiento, y en la segunda sí se está moviendo el bolígrafo.
Como se puede observar en el código, los pasos para detectar movimiento son los indicados en la teoría:
- Conversión de la imagen a escala de grises y realizar la diferencia entre la imagen actual y la anterior o el fondo fijo en su caso.
- Binarizar la imagen obtenida, poniendo un umbral que permita discernir que es realmente movimiento de lo que no.
- Y por último, se suma la imagen que contiene los píxeles que indican movimiento con un valor de 255 al canal verde, por eso se ve en verde la zona en movimiento.
Práctica: Detectar un objeto
Hasta el momento hemos detectado zonas de un color concreto y zonas en movimiento. Éstas se supone que se corresponden con un objeto concreto, que nos resulta de interés, pero hasta el momento no hemos obtenido información real del objeto, tan solo sabemos que hay algo de un color, o hay algo en movimiento. Pero para interactuar, es necesario saber donde está el objeto determinando, por ejemplo, su centroide.
En esta parte se pide al alumno que modifique el código entregado para que, por ejemplo con la parte de detección de color (con la parte de detección de movimiento sería igual), detecte el contorno de las zonas del color detectado, y de todos los contornos detectados, escoja solo el de mayor tamaño y calcule su centroide, como se muestra en las imágenes.
NOTA: Tenga en cuenta que en ocasiones se puede detectar la propia imagen como un contorno, por lo que hay que tener en cuenta que el objeto detectado tambien tendrá un tamaño máximo.
Práctica: Detectar un objeto (solución)
Práctica: Atrapa el topo....
Tras la práctica anterior, en la que se ha calculado el centroide del marcador del color buscado, se pretende usar este marcador para poder jugar al juego "atrapa el topo".
Concretamente se pide que se pinten 4 cuadrados en la pantalla, de forma que aleatoriamente alguno se ponga de un color concreto, y en ese momento, el usuario de la aplicación tendrá que mover el marcador de color sobre el cuadrado para que se desactive (atrape el topo) y tras un tiempo, se vuelva a poner de color alguno de los otros cuadrados.En las imágenes se muestra la idea del programa.

