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

   

A %d blogueros les gusta esto: