La computadora es una herramienta versátil. Podemos hacer cálculos extremadamente complejos, jugar videojuegos, pintar como un gran artista o bien, procesar textos, entre tantas otras cosas que se pueden hacer con este genial invento. De hecho, probablemente la computadora ha atraído a cada vez más personas gracias a que las cosas se ven en modo gráfico y los programadores se han empeñado en mostrarnos la analogía gráfica sobre la consola de texto, el modo terminal, indicándonos de alguna manera que una imagen vale más que mil palabras.
Partiendo de esta idea, hay en el mercado una buena cantidad de programas para dibujar. Ellos tienen una serie de herramientas que permiten cambiar colores, grosores de las plumas con las que pintamos, amén de manipular gráficamente las imágenes para hacer operaciones increíbles en términos de dibujo como cortar regiones, pegarlas donde se nos antoja, etcétera.
Pensando en esto alguna vez imaginé que sería un buen ejercicio escribir mi propio programa de “Paint”, pero la verdad me daba mucha flojera rehacer lo que se ha hecho un sinfín de veces. Así que un día, viendo un pequeño robot que dibuja lo que ve en una fotografía, se me ocurrió hacer lo mismo, nada más que obviamente obviando el hardware. Nada de microcontrolador Arduino, cables y programa en Processing o Matlab. No, pensé que podía simular lo que el robot dibuja en papel, pero yo haciéndolo en la pantalla de video. Y es así como nació “el dibujante electrónico”.
La idea básicamente es hacerse de una foto, preferiblemente el rostro de alguien, aunque no es necesaria esta condición. El programa toma la imagen, hace una serie de procesos sobre ella y entonces decide pintarla. El resultado final se parece en general a la fotografía dada. Desde luego, hay imágenes más ad hoc para funcionar con este programa que otras, sin embargo, aquí lo que cuenta es la idea en sí.
El programa, algunos pueden creer, usa algunas técnicas de inteligencia artificial para reconocer el rostro y entonces hallar las características más relevantes del mismo, pero esto es demasiado complejo para hacerlo en un programa de esta naturaleza. Aquí lo que se hace el programa es usar una rutina para hallar los bordes (llamada canny edge detector), la cual nos da una imagen blanco y negra, en donde los puntos blancos son precisamente los bordes. El siguiente paso es invertir esa imagen para que quede positiva, es decir, puntos negros sobre fondo blanco. Finalmente se usa el filtro dilatación (filtro mínimo), para engrosar un poco los bordes. Con todo esto, el programa toma la imagen procesada y pinta sobre las regiones con puntos negros. Para ello se usa un pincel a manera de spray, pero con muy poca dispersión.
El resultado final es satisfactorio, pero considerando que los programas son obsoletos una vez que se consideran terminados, hallé que podía mejorar algunas cosas: la primera idea fue incorporar una cámara web que tomara fotos directamente y las pasara al programa para ser directamente procesadas. Alguna vez había intentado manejar videos en mis programas y recuerdo que ni había sido fácil y menos, que fuese posible hacer algo que funcionara para todas las cámaras web que hay en el mercado. De todas maneras me armé de valor y empecé a buscar información. Hallé un par de rutinas que en principio, podían manejar la imagen. Eran unos componentes para Delphi. Instalé uno y no sirvió. Instalé el segundo y aparentemente las cosas funcionaron mejor. Para esto, tuve que pedir una cámara web prestada porque la mía simplemente la desconoce Windows 7 y el “driver” de la misma no funciona en mi operativo. Me prestaron una cámara de Logitech. Instalé el manejador y listo, todo funcionó correctamente. Mi programa ya podía entonces capturar una imagen para ser procesada por el robot dibujante.
No obstante esto, en algunas pruebas que hice, a veces el manejador de la cámara (que depende de Windows), no hacía correctamente la tarea y se negaba a conectarse, mandándome un error imposible de recuperar. Así, tuve que agregar una advertencia al programa indicando que esta opción era “experimental” y que se usase en esos términos. Hice pruebas en otras máquinas y encontré que con las webcam de Logitech todo funciona correctamente. Probé en mi laptop y a pesar de que el manejador no parece ser el mismo que se usa en Windows 7, las cosas no fallaron. En cambio, en una tablet Iconia, de Acer, con Windows 8, mi programa nunca pudo conectarse con el manejador de la cámara.
Dejando este problema a un lado, le agregué una nueva opción que llamé “herramientas”, en donde por lo menos ahora se puede cambiar el color del pincel con el que el programa pinta. Supongo que en la medida que se me vayan ocurriendo nuevas funciones, ahí las pondré. Se me ocurre tener un catálogo de “pinceles” para hacer más flexible la manera de pintar, por ejemplo. Le cambié a todo esto la “piel” a la aplicación y le puse un icono más ad hoc con la idea del software. Ahora se ve mejor el resultado final.
Me faltan cosas, sin embargo. Por ejemplo, no me convence la manera en que el robot dibujante pinta. Me gustaría que pintara más como un dibujante y no “barriendo” la imagen. Eso le daría al usuario elementos para ver a un verdadero robot dibujando. Otra cuestión que he estado pensando y que hay que incorporar en algún momento, es que el programa no pinte exactamente la imagen que ve, sino que se desvié un poco de la misma, haciendo ver “más humano” al programa y no tan perfecto. Esto último sin duda me parece de lo mas atractivo.
Como puede verse, sigue siendo cierta la idea de que todo software acabado es obsoleto. Y aunque no es la última aplicación, la “killer application”, me ha enseñado a programar cosas que antes ni idea tenía de cómo hacerlas.
A quien le interese este programa, escríbame a [email protected] y se lo mandaré por correo electrónico.