Tag Archives: opencv

White Glove Tracking: Siguiendo el guante blanco

A propósito de la muerte de Michael Jackson, ya tenia tiempo que queria pegar este video aqui. Se trata de dar seguimiento al guante de Michael en un conocido video que salio en TV. Se logró el tracking cuadro a cuadro del guante y luego alguna gente sin que hacer algunos artistas hicieron algunos efectos usando las coordenadas del tracking. En el siguiente video se le agrega un efecto de flamas al guante:

A mi me gusta el reencuadre poniendo el guante en el centro y tambien el del guante gigante:

Para ver mas videos de trabajos sobre el guante puedes ir a la página del proyecto: White Glove Tracking y ver su galeria.

Es interesante que a pesar que ese proyecto parece solo un juego, en realidad es in trabajo de importancia porque hace etiquetado manual, lo cual es una de las tareas mas tediosas que son requeridas en el area de ciencias de la computación. Ahora se tiene un corpus etiquetado para poder probar algoritmos de tracking. Aún más interesante es que en el video ocurren oclusiones parciales y totales, deformaciones del target, cambios de camara, movimientos rapidos. Todos los retos ocurren de manera simultánea y para empeorar las cosas, es video de mala calidad y con artefactos de compresion. El tracking automatizado del guante es un formidable reto para un tracker. Tal vez en el futuro algun articulo científico haga mencion al proyecto White Glove Tracking.

Howto: Compilar Mimas 2.1 y su libmimas.so en GCC 4.2.x

Mimas es un toolkit muy completo, incluso mas completo que OpenCV. Pero compilarlo es una pesadilla, el procedimiento al que llegúe es el siguiente:

  1. Descarga Mimas-2.1 (30 Oct 2006)
  2. Entra al directorio y: make -f Makefile.dist
  3. Aplica el ./configure y asegúrate de no tener errores, si tiene errores es por culpa de librerías que te faltan, instálalas. El configure es muy explícito y te dice qué salió mal.
  4. Lo que realmente es útil es la librería, asi que entra al directorio lib y: make
  5. Si tienes un GCC reciente(>4.2.2) lo más seguro es que no funcione, así que elimina todas las referencias a lo siguiente:
  • findpipette
  • pgh_2dobject
  • pgh
  • pgh_scene
  • pol
  • pol_locator_hough
  • pol_locator_scale
  • pol_model
  • pol_scene

Y me refiero a TODO, incluyendo los *.lo, *.cc y *.Plo. Si lo hiciste bien, y tienes las librerías completas, entonces podrás compilar con make.

Ahí mismo donde tienes el Makefile podrás ver el resultado de la compilación si entras al directorio .libs (comienza con un punto por lo que no aparece en el ls, pero aparece en el ls -la). Por cierto, si te sirven, todos los *.o son objetos que puedes enlazar individualmente de manera estática.

$ cd .libs
$ ls  *.o         (objectos compilados)
$ ls libmimas*    (static & shared objects)

El archivo .libs/libmimas.so.2.0.1 y sus links simbólicos son el shared object y junto con el directorio mimas-2.1/include (el cual contiene los headers) sirven para desarrollar usando mimas. Todo lo de la carpeta lib se compiló exceptuando los que eliminaste del makefile.

Y como siempre hay gente muy floja.

¿Por qué hacer todo esto?

Porque salen errores de este tipo

../include/image_op.h:100:   instantiated from ‘mimas::image<T> mimas::image_func(const mimas::const_image_ref<T2, T2Ptr>&, const mimas::const_image_ref<T3, T3Ptr>&, F) [with T1 = int, T2 = int, T3 = int, F = std::multiplies<int>, T2Ptr = int*, T3Ptr = int*]’
../include/image_op_help.h:22:   instantiated from ‘mimas::image<T> mimas::operator*(const mimas::const_image_ref<T, TPtr>&, const mimas::const_image_ref<T, UPtr>&) [with T = int, T1Ptr = int*, T2Ptr = int*]’
../include/image_funcs.h:390:   instantiated from ‘mimas::image<T> mimas::edgeHaynesJain(const mimas::const_image_ref<T, TPtr>&, const mimas::const_image_ref<T, UPtr>&) [with T = int, T1Ptr = int*, T2Ptr = int*]’
findpipette.cc:92:   instantiated from here

../include/image_op.h:75: error: no matching function for call to ‘multi_apply(boost::multi_array_ref<int, 2u>&, boost::const_multi_array_ref<int, 2u, const int*>&, boost::const_multi_array_ref<int, 2u, const int*>&, mimas::_multi_help2<int, int, int, std::multiplies<int> >&)’

[...]

make: *** [findpipette.lo] Error 1

WTF???????????

Que en español es

../include/image_op.h:75: error: no hay una función coincidente para la llamada a ‘multi_apply(boost::multi_array_ref<int, 2u>&, boost::const_multi_array_ref<int, 2u, const int*>&, boost::const_multi_array_ref<int, 2u, const int*>&, mimas::_multi_help2<int, int, int, std::plus<int> >&)’

Solución para: “Debugger detected! Please close it down and restart!”

Hoy parece un día malo, primero el Visual Studio y ahora esto:

Debugger detected! Please close it down and restart!
Windows NT user: Please note that having the WinICE/SoftICE services installed means that you are running a debugger!

Debugger detected! Please close it down and restart! Windows NT user: Please note that having the WinICE/SoftICE services installed means that you are running a debugger!

Algunos dicen que hay que eliminar el Nero, pero yo no tengo Nero. El responsable sin embargo parece ser la compañia detrás de Nero. Este diálogo proviene de NeVideo.ax. Es un filtro de DirectShow. Te toparás con este error si estas haciendo procesamiento de video, usando librerias de DirectShow, OpenCV o algo similar.

Solución

Elimina ese archivo NeVideo.ax. En mi caso lo encontré en
C:\Archivos de programa\Archivos comunes\Ahead\DSFilter\NeVideo.ax

Si no tienes ese archivo tal vez sea uno nuevo de Nero o de alguna otra inteligente compañia que le gusta atormentar a los desarrolladores. La solucion en ese caso es darle “Aceptar” al diálogo y buscar entre los Resultados (Output) de Visual Studio algun mensaje que tenga que ver con archivos .ax raros.

¿Quien es el culpable el Thread o cvCam?

Estoy implementando una DLL para el asunto de mi tesis, eso de reconocer los gestos de manera monocular. Para ello necesito que mi programa sea una DLL que va a cargarse en otro programa al cual no tengo ningun acceso (uhm Closed Source, si!, maldicion!). Bueno, ya logré que se cargue, estuve analizando la DLL antigua y logré que mi DLL embonara en lo que el programito me pide.

Basicamente mi DLL debe exportar una única función importante la cual entrega coordenadas 3D. La primera vez que es llamada debe inicializarse sola y comenzar el rastreo. El modo de funcionamiento es el siguiente:

  1. (*) Aplicación pide coordenadas
  2. DLL debe:
    1. Si es primera vez. Responde (0,0,0) y lanza Thread par comenzar rastreo.
    2. Si no es primera vez. Responde con (x,y,z). El thread debería tenerlas ya detectadas.
    3. Avisar al thread cuando debe morirse.
  3. Ir a: (*)

El trabajo del Thread es el siguiente:

  1. Abrir cámara con resolución correcta (o morirse diciendo que no hay cámaras).
  2. Para cada FRAME capturado:
    1. Detectar objeto y obtener sus coordenadas.
    2. Actualizar variable global: coord = (x,y,z).  (global solo en la DLL)
  3. En caso  de aviso de muerte:
    1. Cerrar cámara correctamente
    2. Morirs y liberar recursos

Parece  muy fácil. Aja!, tengo varios dias atorado en la manera de anunciar al Thread que ya debe morirse. No se si sea OpenCV el que no cierra la cámara o el Thread que no se muere. Ya me estoy hartando, y lo malo es que estaba acostumbrado a que en Linux y OSS en general hay forums de IRC donde ayudan, pero busqué en freenet y no encontré nada decente para ambientes de Microsoft. Continue reading

Detectando objetos de algun color

Hay que eliminar todo lo que no queremos, como otros objetos, y basura. Ademas se elimina el background y se quita el ruido.

Se usa el modelo de color HSV, y de el unicamente se usa el Hue pues es el que contiene la informacion de color. Se toma un Histograma como muestra del color y se procede a hacer una convolucion, opencv le llama “backproject” del histograma en la imagen completa. De ahi se obtiene un mapa de probilidades es cual es una imagen en escala de grises donde segun lo blanco de un pixel es la probabilidad que sea del color del histograma, mas blanco mas certero.

Entonces se procesa la imagen de probabilidades para encontrar formas, objetos y otras cosas, en principio se tiene un relajo, todo lleno de ruido.

proba_map.PNG

Se aplica umbralizacion para eliminar todos los pixeles debajo del umbral y si se quiere convertir a blanco todos los demas. Luego se hace deteccion de contorno en lo que queda.

proba_map_contornos.PNG

Ahora, podemos hacer ajuste de figuras geometricas y podemos descartar los que no ajusten bien y los que sean demasiado pequeños. Nos queda algo bastante bueno.

proba_map_ajuste_elipse.PNG

Como ven, en esta ultima ya no se tiene un mapa de pixeles de probabilidad, se tiene una elipse vectorial que se pinto directo sobre donde se predice que esta el circulo azul.

OpenCV y Visual Studio 2005

Para generar un proyecto de Visual Studio 2005 usando Visual C++ se requieren algunos ajustes tanto a Visual Studio como a Windows e incluso al mismo Proyecto.

Sorry por que algunas cosas estan en inglés, es que mi VS05 esta en inglés.
Tracker

El procedimiento para que compile

1. Crear un proyecto (o abrir uno que tengas)
2. En el “Solution Explorer” clic derecho en el proyecto (NO en la “Solución”)
3. Clic en “Properties”
4. Bajo “Configuration Properties”->”C/C++”->”General” Buscar
“Additional Include Directories”, Click ahi.
5. Luego en el botón de la derecha con “…”.
6. Vas a agregar nuevos directorios.
7. Dependiendo de lo que estes haciendo vas a ocupar alguno de estos o mas fácil ponlos todos al cabo no afecta:
“C:\Archivos de Programa\OpenCV\cv\include”
“C:\Archivos de Programa\OpenCV\cvaux\include”
“C:\Archivos de Programa\OpenCV\otherlibs\highgui”
“C:\Archivos de Programa\OpenCV\cvcore\include”

8. Click en “Ok/Aceptar” y ve a “Configuration Properties”->”Linker”->”General”
9. Click en “Additional Library Directories” y de nuevo en el botón con “…”.
10. Additional library directories:
“C:\Program Files\OpenCV\lib”
“C:\Program Files\OpenCV\bin”

11. Click “ok/aceptar” y vas ahora a “Configuration Properties”->”Linker”->”Input”.
12. Click en “Additional Dependencies” y en el botón “…”.
13. Agrega las librerías del proyecto. Las más comunes y básicas son:
cv.lib
cvcam.lib
highgui.lib
cxcore.lib
cvaux.lib
Nota: Si te fijas, todas las dependencias anteriores llevan comillas, pero estas últimas no llevan..
15. Recuerda poner #include “cv.h” y demas cosas en tu código cpp/c.

Ejecutar con OpenCV ya que has compilado

1. Click en el Menú Inicio, Clic derecho en Mi PC.
2. Click en “Propiedades”
3. Click en “Avanzado”
4. Click en “Variables de Entorno”. Modificar o agregar la variable de “PATH” y al principio de todo poner “C:\Program Files\OpenCV\bin;” (Ojo que lleva un punto y coma)
7. Click “Aceptar” y ya.
8. Necesitas cerrar Visual Studio y abrirlo de nuevo para que agarre la variable PATH.
9. Una forma de cerciorarte de que el PATH esta puesto es abrir una ventana de cmd.exe y escribir PATH y Enter, deberías ver entre las lineas la que acabas de meter.

Ahora puedes compilar y ejecutar proyectos que usan OpenCV en Visual Studio 2005.

Si no lo hiciste bien el Visual Studio se va a quejar que no encuentra archivos “.lib” al compilar y si logras compilar pero no agregas el PATH te va a decir que no encuentra las DLL.

Que lata!, pero asi es Windows. Si estas instrucciones no te funcionan, deberás reiniciar Windows 50 veces, instalar Norton, NOD, MCAffee, Kaspersky, Panda y ClamAV, todos juntos. Reinicias Windows otras 50 veces. Luego instalas AdAware y Spybot Seach&Destroy. Reincias 50 veces más. Instalas Firefox. Reinicias otras 50 veces. Instalas alguna otra herramienta nueva que exista y, ya sabes, reinicias otras 50 veces. Si al final de esto no aún funciona, deberás repetir el procedimiento pero antes formateas tu PC, reinstalas windows y, claro, reincias otras 50 veces. Si despues de esto no funciona entonces… no se, preguntale a alguien que sí sepa.

Ahh, por cierto, gracias a Alex por ponerme el procedimiento bien detallado.