Inicio > Programación, Resolución problemas > OpenCv 2.0: Problemas con soporte OpenMP

OpenCv 2.0: Problemas con soporte OpenMP

Miércoles, 27 de Enero de 2010 piponazo Dejar un comentario Ir a comentarios

En la nueva versión de OpenCV por defecto está desactivado el uso de OpenMP pero este se puede activar de forma sencilla. Sin embargo al activar el uso de OpenMP, muchas personas se quejan de que algunas funciones de la librería dejan de funcionar. El caso más conocido es el de la función imwrite con la que podemos guardar imágenes y matrices. Mucha gente ha sufrido este problema y hasta ahora nadie había ofrecido una solución, pero recientemente he descubierto la causa de esta extraña situación.Cuando activamos el uso de OpenMP para la compilación de la librería se añade una “maléfica” flag de compilación que es la causante de todo este embrollo. Dicha flag es:

-D_GLIBCXX_PARALLEL

No he encontrado información en la red acerca de esta flag, pero todo me hace pensar a que la propia naturaleza de las clases STL, las cuales contienen miembros estáticos internamente según tengo entendido, hace que dejen de funcionar las funciones que contienen algún argumento STL (vector, list, map, etc). Sin ir más lejos, la nueva función imwrite que reemplaza a cvSaveImage, contiene un argumento del tipo vector. Por lo tanto para solucionar este problema solo tenemos que eliminar dicha flag de compilación del fichero configure.ac o CMakeLists.txt, según si configuramos nuestro proyecto con autotools o cmake. Además. el soporte de OpemMP seguirá funcionando perfectamente ;).

In the new OpenCV version the use of OpenMP is disabled by default but it can be enabled easily. However, when OpenMP support is activated a lot people complain that some library functions and methods fail. The most famous case is the function imwrite used to save images and matrices. Many people have experienced this problem and no no one has yet offered a solution but I recently have discovered the cause of this situation.

When the OpenMP support is enabled for the library compilation an “evil” compilation flag which cause this mess is added :

-D_GLIBCXX_PARALLEL

I have found no information about this flag on internet, but I think that the own nature of STL classes which contains internal static members as I understand, make that functions with STL arguments fail. The new function imwrite that replaces cvSaveImage has a vector argument and so when you try to compile programs that call this function you will get errors in liking phase. The solution to this problem is to delete this flag from configuration file configure.ac if we use autotools or CMakeLists.txt is we use cmake. Furthermose, the OpenMP support will run correctly without this flag ;).

GD Star Rating
loading...
OpenCv 2.0: Problemas con soporte OpenMP10.0102
  • Share/Bookmark
  1. Miércoles, 27 de Enero de 2010 a las 11:44 | #1
    GD Star Rating
    loading...

    Como siempre un post muy interesante.

    No estoy trabajando con la versión 2.0 sino con la 1.0 puesto que nunca llegué a conseguir que funcionara las cámaras firewire + Ubuntu 8.04 y eso es fundamental para lo que estoy haciendo. De todas formas me interesa todo lo relacionado con esta versión ya que en la versión 10.04 de Ubuntu vendrá en los repositorios y probáblemente le de una segunda oportunidad.

    Por otro lado, ¿notas la mejoría con OpenMP? ¿En que funciones? O:-)

    Muchas gracias.

  2. Miércoles, 27 de Enero de 2010 a las 11:57 | #2
    GD Star Rating
    loading...

    Hola tArKI. En el laboratorio donde trabajo tenemos bastantes cámaras Firewire y no hemos tenido problemas con la OpenCV 2.0 excepto algo que comenté en esta entrada (http://plagatux.es/2009/11/ubuntu-failed-to-initialize-libdc1394/). Sin embargo, ha sido uno de mis compañeros el encargado de realizar las librerías necesarias para usar las cámaras por lo que no conozco los pormenores con los que posiblemente te estés encontrando tu.

    En cuanto a lo de OpenMP la verdad que no me he parado a hacer pruebas específicas de rendimiento, pero gracias a mis queridos comandos grep y awk te dejo aquí la lista de ficheros donde se incluye código OpenMP ;):

    cv/cvcascadedetect.cpp
    cv/cvsurf.cpp
    cv/cvtemplmatch.cpp
    cv/cvstereobm.cpp
    cv/cvhaar.cpp
    cv/cvdistransform.cpp
    cv/cvlkpyramid.cpp
    cv/cvstardetector.cpp
    cvaux/cvselfsimilarity.cpp
    cvaux/cvhog.cpp
    cvaux/vs/blobtrackingmsfg.cpp
    cvaux/vs/blobtrackanalysisior.cpp
    cvaux/cvspinimages.cpp
    ml/mltree.cpp
    ml/mlrtrees.cpp

    Te aconsejo que te pases pronto a la nueva versión. El manejo de matrices ahora es una auténtica maravilla :).

  3. Miércoles, 27 de Enero de 2010 a las 12:00 | #3
    GD Star Rating
    loading...

    Es un placer contar con tu sabiduría ;)

    Voy a probar cuando tenga un hueco a instalar la versión 2.0. No obstante me gustaría saber una cosa, ¿sabes si un código escrito en versión 1.0 será compatible con la versión 2.0?

    Gracias :)

  4. Miércoles, 27 de Enero de 2010 a las 12:29 | #4
    GD Star Rating
    loading...

    jeje gracias gracias :P. No te preocupes, el código sigue siendo totalmente compatible.

  5. Miércoles, 27 de Enero de 2010 a las 14:43 | #5
    GD Star Rating
    loading...

    Gracias por la info. Ya te contaré que tal. Si necesitas algo dímelo ;)

  6. Miércoles, 27 de Enero de 2010 a las 16:33 | #6
    GD Star Rating
    loading...

    Gran post de muchisima ayuda.

    Muchas gracias!!

  1. Sin trackbacks aún.