Carnival LiveCam, realidad aumentada hecha fácil

Intro
Después de mucho tiempo de estar desarrollando en background, finalmente presento mi proyecto más ambicioso Carnival LiveCam.
Carnival LiveCam permite capturar imágenes desde diversas fuentes (webcams, archivos de video, archivos de imágenes), y aplicarle diversos efectos como por ejemplo efectos de lluvia, fuego, mascaras, efectos 3D y 2D de todo tipo. Así como también permite tomar fotos y grabar la cesión en video.
Carnival LiveCam todavía esta en una etapa muy temprana de su desarrollo, pero ya muestra muchas de las características que es capaz de ofrecer. Es el momento ideal para unirse al desarrollo del programa.
Carnival LiveCam esta licenciado bajo GPLv3 y alojado en github.
Origen
La idea de crear Carnival LiveCam surge a raíz de que después de comprarme una webcam, junto con la webcam venía un software que aparentemente (por lo que pude ver en las imágenes de la caja) hacía lo mismo que Carnival LiveCam pero que no era libre y que ni siquiera funciona en GNU/Linux, que desde ese entonces hasta el día de hoy es el único sistema operativo instalado en todas las computadoras de mi casa :), sinceramente desconozco si realmente hace lo mismo que Carnival LiveCam, nunca use ese software y muy probablemente nunca lo haré, estoy muy seguro de que mi software llegará a ser muy superior a cualquier otro producto ya sea libre o privativo existente en el mercado.
Ese mismo día me pico la curiosidad y comencé a buscar en Internet si existía algo que me permitiera detectar rostros, movimientos, , motores 3D, etc., para luego utilizarlos para aplicarle a la webcam los efectos deseados, y con ello conocí la existencia de por ejemplo OpenCV, la cual es una biblioteca libre bajo licencia BSD, y también conocí la existencia de diversos motores gráficos también libre, y aquí es cuando llegó mi duda Si en en GNU/Linux tenemos esas espectaculares herramientas, ¿Porque hasta ahora nadie las a utilizado para crear un software tan atractivo para el usuario?, vamos es lógico pensar que un software así se debería de convertir automáticamente en una killerapp. Ok, si nadie la hizo entonces la voy a hacer yo.
Durante varios días esa pregunta estuvo rondando mi cabeza y finalmente me decidí a investigar, ¿Que tan difícil es capturar video desde una webcam?, y allí surgió mi primer experimento. Luego no tarde mucho en agregarle funciones para tomar fotografías y grabar video entre otras cosas. Toda la interfaz gráfica y el corazón del programa decidí desarrollarlo usando el framework Qt, la razón es que desde siempre he sido un gran admirador de proyecto KDE el entorno de escritorio basado en Qt. Y por supuesto porque Qt es por lejos el framework gráfico más avanzado de todos.
Para ese entonces estaba desarrollando otro proyecto, que para ese entonces ya no necesitaba, entonces llegó la dura decisión, pues ambos son proyectos muy complejos y me resultaría difícil mantener los dos, y decidí apostar todo por el nuevo proyecto y con el cual venía avanzando a buen ritmo. Si alguien se quiere encargar de mi anterior proyecto bienvenido sea :)
Ya con la base del programa terminada, comencé a experimentar intentando aplicar algún efecto 3D, aquí el segundo experimento, ya en ese momento me empecé a dar cuenta que era imposible para mí crear toda la infraestructura necesaria para desarrollar escenas 3D complejas, ni modo, o uso un motor 3D o me muero antes de presentar el proyecto :P
Luego viene la primera revolución del proyecto, comienzo a experimentar con QML y el resultado me deja más que satisfecho así que decido portar la interfaz gráfica, que en ese momento estaba desarrollada con el modelo clásico de widgets, a QML.
Ahora toca tratar de integrar un motor gráfico con el proyecto, y aquí viene la segunda revolución, hasta ese momento venía desarrollando todo el proyecto en lenguaje Python, pero después de investigar y probar muchos motores gráficos me resulto imposible encontrar un motor para Python que cubriera todas mis expectativas, y finalmente decidí portar el proyecto a C++, y después de varias pruebas escogí a OpenSceneGraph como el motor 3D de mi proyecto. Este fue mi tercer experimento.
Luego tocó rediseñar el mecanismo para grabar video usando FFmpeg, mi cuarto y quinto experimento.
Luego vinieron muchos experimentos más como la inclusión de QtPlugins, Git y finalmente Doxygen (estos todavía no están documentados).
Y finalmente llego el momento de ponerle un nombre y dar el anuncio oficial, ¡Carnival LiveCam ha nacido!.
Tecnologías claves
Las principales con las que esta desarrollado Carnival LiveCam son:
- Qt: El corazón de Carnival LiveCam, los plugins y la tinterfaz gráfica, todo software regido por este maravilloso framework.
- OpenSceneGraph: Motor gráfico basado en OpenGL, permite renderizar escenas 3D complejas, y añadir objetos 3D animados a la escena.
- OpenCV: Podemos usar OpenCV para crear efectos gráficos basados en la detección de rostros, formas, colores, movimientos, etc..
- FFmpeg: Se utiliza principalmente para grabar la sesión actual a video.
- Doxygen: Se utiliza para generar la documentación de Carnival LiveCam.
- Git: Es el sistema de versionado de Carnival LiveCam. Fácil de usar, ideal para gestionar proyectos de gran envergadura, con una gran cantidad de colaboradores.
Conceptos básicos
El diseño de Carnival LiveCam esta pensado para ser completamente modular, siendo muy fácil expandir el programa mediante plugins utilizando el sistema de QtPlugin, hasta el momento los tipos de plugins disponibles son:
- Caramelos: Este tipo de plugins son los encargados de proveer los efectos gráficos a Carnival LiveCam. El concepto de "caramelo" viene de Eye Candy, que se traduciría como Endulzar la vista, algo que es atractivo a la vista, por lo tanto un caramelo (o dulce, o golosina según en que país se encuentre) es lo que sirve para endulzar la vista.
- Drivers: Estos plugins se utilizan para agregar nuevos dispositivos de captura. Estos no son drivers como los del sistema operativo, estos drivers no trabajan a nivel de hardware, sino mas bien que trabajan en una capa superior por encima de los drivers del sistema operativos, por ejemplo estos drivers capturan imágenes desde la webcam usando OpenCV o V4L2, pero si usted no tiene instalados los drivers de su webcam entonces no podrá capturar imágenes desde la webcam usando este driver.
- Shells: Una shell es una interfaz gráfica o no con la que el usuario interactuar con Carnival LiveCam, esta interfaz puede estar basada en Qt Widgets, QML, Web, linea de comandos, etc.. El concepto de "shell" proviene de de los entornos tipo *nix como puede ser GNU/Linux donde el usuario puede escoger el entorno gráfico con el que interactuará con la computadora. Carnival LiveCam también brinda la misma libertad
Un pequeño tour
En la parte inferior al centro de Carnival LiveCam podemos ver la barra de controles, de izquierda a derecha los controles disponibles son:
- Seleccionar dispositivo de captura.
- Tomar una fotografía.
- Grabar video.
- Abrir la barra de caramelos.
- Poner la ventana a pantalla completa.
- Información sobre el programa.

En la parte derecha de Carnival LiveCam podemos ver la barra de caramelos, aquí podemos activar los efectos que queremos aplicar al video. Los efectos se activan o desactivan simplemente haciendo click sobre la vista previa, los efectos que no están activados se ven con un recuadro rojo los que están activados se ven en verde. Cada caramelo dispone de 3 controles:
- Esquina superior derecha: Este control nos muestra si el caramelo requiere o no de aceleración 3D.
- Esquina inferior izquierda: Muestra información sobre el caramelo.
- Esquina inferior derecha: Permite configurar el caramelo. Solo esta disponible en algunos caramelos.
También podemos filtrar por el tipo de caramelo usando el combobox en la parte superior.

Dentro de la barra de caramelos tenemos también la pila de caramelos, aquí podemos cambiar el orden en que se aplica cada efecto.

Aquí podemos apreciar uno de de los diálogos de configuración de un driver, en este caso el driver de imágenes. Con un diseño sencillo pensado para una experiencia point&click.

Obtener y probar Carnival LiveCam
Para obtener una copia de Carnival LiveCam y comenzar a trabajar en el proyecto, ejecutamos el siguiente comando:
git clone https://github.com/hipersayanX/Carnival-LiveCam.git
Para compilar y correr Carnival LiveCam ejecutamos el siguiente comando:
cd Carnival-LiveCam ./build_all.sh ./Carnival-LiveCam
Para poder compilar y correr Carnival LiveCam necesitamos los siguientes paquetes de software:
- Qt >= 4.7.x
- OpenSceneGraph >= 3.0.x
- OpenCV >= 2.3.x
- FFmpeg
- ffmpegthumbnailer >= 2.x.x
- Doxygen >= 1.7.5.x
- Graphviz >= 2.28.x
- Texlive-bin >= 2011.x
- Git >= 1.7.x
- Mscgen >= 0.22
Es muy probable que se pueda compilar y usar Carnival LiveCam con versiones anteriores al software indicado, lo desconozco. El entorno en el que actualmente estoy desarrollando Carnival LiveCam es Arch Linux x86_64. Los paquetes necesarios según Arch linux son:
yaourt -S qt openscenegraph opencv ffmpeg ffmpegthumbnailer doxygen graphviz texlive-bin git mscgen
Lo que hay y lo que falta por hacer
En principio la base del programa esta casi terminada, hasta el momento sólo están disponibles a modo de prueba 3 caramelos, los cuales dan un pequeña muestra de lo que se puede hacer con el programa, un caramelo que muestra como integrar OpenSceneGraph con Carnival LiveCam para poder crear efectos 3D, otro que muestra como utilizar OpenCV para crear efectos basados en la detección de rostros, y por último uno que muestra como realizar efectos 2D sencillos.
Luego están disponibles un driver básico para capturar imágenes desde la webcam, y también otros 2 para capturar para capturar imágenes desde archivos de imagen y video.
Y por último la shell diseñada en QML.
De lo que falta por hacer tenemos:
- Como alta prioridad se encuentra la creación de los drivers de la webcam para Mac OS X y Windows.
- Diseñar un mecanismo que permita capturar y mostrar desde varios dispositivos al mismo tiempo, por ejemplo que se puedan mostrar 3 webcams al mismo tiempo. En eso estaré trabajando en estos días.
-
Lo ideal sería que llegado el momento de liberar la versión para usuarios finales, Carnival LiveCam disponga de al menos unos 20 caramelos que brinden diversos efectos que el usuario pueda aplicar a sus videos.
También sería ideal contar con más shells, por ejemplo una interfaz web, un plasmoide para KDE, etc.. - Hasta el momento Carnival LiveCam no dispone de ningún logo, ni artwork, ni una pagina web que lo identifique. Si tienes alguna idea para compartir en estos aspectos sería genial que te unas al desarrollo.
- Cualquier otra idea que se te ocurra.
Y finamente...
En general, si sabes como usar Git entonces sabes como colaborar con el proyecto. Simplemente clona el repositorio y comienza a trabajar en tu copia y cuando tengas todo listo y funcionando haz un push request.
Aquí dejo algunos enlaces sobre como usar Git:
Y si alguien esta interesado en participar en el proyecto bienvenido sea :D


Simplemente impresionante, No
Simplemente impresionante,
No soy un fiel usuario de webcams, pero le hecharé un vistazo a tu programa.
Que buen aporte,
Un saludo.
Le voy a hechar un vistazo y
Le voy a hechar un vistazo y a ver lo que se puede aportar! Me parece un gran proyecto
Gracias :), cualquier cosa
Gracias :), cualquier cosa avisen si tienen dudas o problemas para compilar o correr el programa.
Tengo una inquietud... Para
Tengo una inquietud...
Para que es el TexLive-bin?
TexLive-bin es para compilar
TexLive-bin es para compilar la documentación de doxygen, si no me equivoco servía para después poder generar la documentación en PDF.
Precioso :D
Precioso :D