Tag Archive for 'vision'

Las webcams Logitech pueden entregar Bayer

Acabo de comprar unas cámaras Unibrain Fire-i, por dos razones: (i) porque son firewire y hacerlas funcionar en linux es muy fácil, no son una pesadilla como las USB; y (ii) porque puedo obtener datos en formato Bayer.

Pero ahora resulta que las webcams Logitech pueden entregar Bayer. Habrá que probar una de esas, sobretodo la Logitech PRO 9000.

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> >&)’

La competencia: 3D Camera

¿Cuales son los principios básicos?

Estoy 90% seguro que esa es una cámara firewire o tal vez USB2.0 que manda datos en bruto (sin comprimir o tal vez en Bayer) a digamos unos 60 cuadros por segundo, de los cuales solo son útiles 30. Ademas de tener un arreglo de LED’s IR que prende en solo en los frames pares.

Los frames impares son los que se usan para video normal, los pares son usados para detectar la profundidad usando la ayuda del infrarrojo.

¿Como detectar la profundidad?

El IR es reflejado por objetos cercanos, y los objetos lejanos no alcanzan a recibir suficiente iluminacion IR. Es como prender una vela en la oscuridad, sólo puedes ver tu rostro y las cosas cercanas a la vela.

Finalmente

Usando las cosas a la par se puede sacar doble provecho de una cámara, es como tener 2 cámaras en una. Ojala tuviera una cámara con disparador manual. ¿Alguien me quiere regalar una Unibrain?

¿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 ‘¿Quien es el culpable el Thread o cvCam?’

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.