Proyecto Fin de Carrera

Robótica, software y telecomunicaciones.

OpenCV2.2 con IPP activas en Ubuntu 10.10

Parece ser que se ha dado un salto de OpenCV2.1 (versión en los repositorios oficiales de Ubuntu 10.10) a OpenCV2.2 (última versión estable en los repositorios de WillowGarage -Marzo 2011- ) en cuanto a la forma de trabajar con imágenes. Si bien se guarda la compatibilidad con los formatos anteriores como IplImage o cvMat, a partir de ahora lo ideal sería trabajar con imágenes de la clase Mat, aunque de momento muchas funciones o métodos de OpenCV las admiten por igual como argumento.

Como puede complicarse un poco la instalación de la instalación y puesta a punto de esta versión 2.2 de OpenCV, voy a intentar explicar el método paso a paso para tenerlas configuradas para trabajar con IPP.

Antes que nada, doy por supuesto que tienes instalada la última versión de IPP en Ubuntu, en una entrada anterior explico como instalarlas junto a RoboComp.

  • Descomprimimos el archivo en nuestra carpeta de usuario.
  • Abrimos un terminal y nos desplazamos a la carpeta de OpenCV que se nos ha creado:
cd /home/my_user/OpenCV-2.2.0/
  • Ahora editamos el archivo CMakeLists.txt con nuestro editor favorito, por ejemplo gedit:
gedit CMakeLists.txt
  • Dentro de este archivo tenemos que buscar las siguientes líneas: (*Error:¡ Ver aclaración al final del documento!)
if(IPP_FOUND AND USE_IPP)
message(STATUS "    Use IPP:                   ${IPP_PATH}")
else()
message(STATUS "    Use IPP:                   NO")
endif()
  • Donde vamos a cambiar un NO por un YES en la posición marcada con negrita. Es la línea 1404 del archivo.
  • Guardamos y cerramos gedit y desde la consola (suponemos que estamos en /home/my_user/OpenCV-2.0.0/) ejecutamos:
cmake .
make
sudo make install

Con eso ya tendríamos OpenCV2.2 listo para trabajar con las IPP en Ubuntu 10.10 Maverick.

Para utilizar las recién instaladas en RoboComp, simplemente tenemos que modificar el CMakeLists.txt de nuestro componente (no olvidar borrar el CMakeCache.txt y hacer cmake . antes de compilar con el CMakeLists.txt modificado) y añadir el #include a la cabecera de nuestro worker.h:

  • En CMakeLists.txt de la carpeta mycomponentComp/src/ añadimos lo que está en negrita:
ADD_DEFINITIONS( -Wall -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB )
FIND_PACKAGE( Qt4 REQUIRED )
FIND_PACKAGE( OpenCV REQUIRED )
SET( QT_USE_QTGUI TRUE )
SET( QT_USE_QTOPENGL TRUE )
SET( QT_USE_QTXML TRUE )
INCLUDE( ${QT_USE_FILE} )
QT4_WRAP_CPP( MOC_SOURCES ${HEADERS} )
QT4_WRAP_UI( UI_HEADERS ${UIS} )#MODIFICADO LANDER PARA DIBUJAR LA UI

# Specify construction and link process
ADD_EXECUTABLE( leandroComp ${SOURCES} ${MOC_SOURCES} ${RC_SOURCES} ${UI_HEADERS} )
TARGET_LINK_LIBRARIES( leandroComp ${QT_LIBRARIES} ${LIBS} ${OpenCV_LIBS})
  • En worker.h de nuestro componente, inmediatamente encima o debajo de otros #include añadimos la siguiente línea:
#include <opencv2/opencv>

Y ya podemos usar las funciones de OpenCV en nuestro componente. Tener en cuenta que si queremos usar las funciones de OpenCV tendríamos que usar el operador de ámbito de la forma cv::funcionDeOpenCV() o añadir:

using namespace cv;

en la cabecera del worker.h para poder usar las funciones como funcionDeOpenCV(), como explico en esta entrada.

* El punto que está tachado es un error bastante grave, ya que con eso no solucionamos la instalación de OpenCV con IPP, sino que lo único que cambiamos es el mensaje de error cuando al hacer cmake . a OpenCV2.2 y éste no encontrar las IPP, nos dirá que todo está OK aunque en realidad no fuera así. Lo cual, además de no ser la solución, nos conduce a un grave error pensar que OpenCV está usando IPP cuando en realidad no es así.

Buscamos en el CMakeLists.txt las siguientes líneas y las modificamos según el texto rojo:

foreach(v "6.1" "6.0" "5.3" "5.2" "5.1")
    if(NOT IPP_FOUND)
        if(WIN32)
            find_path(IPP_PATH "ippi-${v}.dll"
                PATHS ${CMAKE_PROGRAM_PATH} ${CMAKE_SYSTEM_PROGRAM_PATH}
                DOC "The path to IPP dynamic libraries")
            if(NOT IPP_PATH)
                find_path(IPP_PATH "ippiem64t-${v}.dll"
                    PATHS ${CMAKE_PROGRAM_PATH} ${CMAKE_SYSTEM_PROGRAM_PATH}
                    DOC "The path to IPP dynamic libraries")
            endif()
        endif()
        if(UNIX)
            find_path(IPP_PATH "libippi.so.6.1"
                PATHS ${CMAKE_LIBRARY_PATH} ${CMAKE_SYSTEM_LIBRARY_PATH} ENV ${OPENCV_LOADER_PATH} /opt/intel/ipp/6.1.2.051/ia32/sharedlib
                DOC "The path to IPP dynamic libraries")
            if(NOT IPP_PATH)
                find_path(IPP_PATH "libippiem64t${CMAKE_SHARED_LIBRARY_SUFFIX}.${v}"
                    PATHS ${CMAKE_LIBRARY_PATH} ${CMAKE_SYSTEM_LIBRARY_PATH} ENV ${OPENCV_LOADER_PATH}
                    DOC "The path to IPP dynamic libraries")
            endif()
        endif()

En mi caso tenía instalada la versión 6.1 en 32 bits, pero si tienes una versión posterior tendrías que añadirla en la primera línea de las que comento, por ejemplo añadiendo “7.0” si fuera el caso, después modificar el nombre de archivo libippi.so.6.1 a libippi.so.7.0 (por ejemplo) en caso de la versión de 32 bits o la zona naranja a libippiem64t.so.7.0 en caso de ser de 64 bits. Y después, tal y como destaca la ruta de color rojo, añadir la ruta donde se encuentre el archivo anterior, que en caso de 64 bits sería en la línea siguiente a la que tiene marcado el nombre naranja.

Esta forma es un poco chapucera porque es un método “a mano”, pero de momento parece que funciona. Espero no haber metido la pata esta vez, pero si alguien tiene sugerencias, se admiten todas.

Pido disculpas por los inconvenientes que he podido ocasionar por el error inicial.

Anuncios

1 abril 2011 - Posted by | all | , , ,

4 comentarios »

  1. […] del esperado es utilizar OpenCV 2.2 en mi componente. Ya en otra entrada explicaba como instalar OpenCV 2.2 en Ubuntu 10.10 y dejarlo preparado para trabajar con RoboComp y las IPP de Intel. Sin embargo, la simple tarea de […]

    Pingback por Cómo usar OpenCV 2.2 en RoboComp « Proyecto Fin de Carrera | 10 abril 2011 | Responder

  2. […] ->Como ya anoté en una entrada anterior es necesario eliminar ese archivo antes de hacer ” cmake .” tras modificar el […]

    Pingback por Subir un componente al repositorio de RoboComp « Proyecto Fin de Carrera | 14 mayo 2011 | Responder

  3. Hola Leandro;
    He comprobado el estado de IPP de la siguiente manera

    //Comprobación de la IPP instaladas————————
    const char* libraries;
    const char* modules;
    cvGetModuleInfo( 0, &libraries, &modules );
    printf(“Libraries: %s/nModules: %s/n”, libraries, modules );
    //———————————————————-

    Y no me aparece ningún modulo instalado, ¿tu tienes algún problema?

    Estas haciendo un gran trabajo con tu blog. Saludos.

    Comentario por Luis Miguel | 24 junio 2011 | Responder

  4. Hola Luismi,

    Desconocía que ese era el método de averiguar si las IPP están activas en OpenCV, o para saber que versión de OPENCV estoy usando, de todos modos he hecho esto:
    const char* libraries;
    const char* modules;
    cvGetModuleInfo( 0, &libraries, &modules );
    std::cout<<"Libraries: "<<libraries<<std::endl;
    std::cout<<"Modules: "<<modules<<std::endl;

    Y el resultado que me muestra es el siguiente:
    Libraries: cxcore: 2.2.0
    Modules:

    Por lo que deduzco que no las tengo instaladas, pero la verdad es que ahora estoy en Salabeta y el fallo este lo detecté y corregí en mi portátil, luego compruebo si allí me sale lo mismo, oki?

    Comentario por Leandro | 24 junio 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: