Inicio > Distribuciones, Programación, Resolución problemas > Opencv 1.1pre + ffmpeg en Linux

Opencv 1.1pre + ffmpeg en Linux

Lunes, 13 de abril de 2009 Dejar un comentario Ir a comentarios

opencv_logo

Llevaba tiempo con ganas de publicar algo sobre OpenCv y al fin puedo publicar algo que seguro gustará a mucha gente. OpenCV es una magnífica librería de procesamiento de imágenes que es ampliamente usada en la comunidad de los programadores que nos dedicamos a este campo, el cual se puede relacionar con la visión por computador, robótica, etc. En la mayoría de distribuciones viene un conjunto de paquetes que instalan opencv en nuestro equipo, estos paquetes suelen ser :

  • libcv-dev
  • lbcvaux-dev
  • libhighgui-dev

Como ya he dicho la librería es fabulosa pero hay un pequeño punto negro que seguramente será resuelto con el tiempo. Dentro de OpenCV tenemos una librería llamada highgui cuyo objetivo es trbajar con las imágenes y vídeos de forma más sencilla, e incluso nos provee de una interfaz para poder mostrar las imágenes en ventanas, manejar eventos de teclado y ratón, etc. Dicha librería depende, a su vez, de la librería ffmpeg para poder leer los vídeos o trabajar con cámaras web. El problema reside en que la mayoría de distribuciones actuales mantienen una versión de ffmpeg muy vieja en sus repositorios y hay dos funciones que han quedado obsoletas: av_decode_video y img_convert. Concretamente el problema parece estar en img_convert que ha sido definitivamente sacada de ffmpeg y ahora se utiliza otra librería para sustituir esa parte obsoleta de código -> libswscale.

La cuestión es que si intentamos instalar la última versión de OpenCV, no podremos disfrutar de las bondades de la librería highgui a no ser que nos instalemos la última versión de ffmpeg, pero es que aún así, hay que hacer unos pequeños ajustes en el código de OpenCV, ya que nos busca las cabeceras de ffmpeg donde no debe. A continuación os doy todos los pasos a seguir para conseguir tener Opencv1.1pre con soporte de ffmpeg en tu distribución GNU/Linux.

Lo primero que vamos a hacer es bajarnos la última versión de OpenCV desde la web del proyecto en sourceforge. Después haremos lo propio con la última versión de ffmpeg, aunque aquí podemos elegir entre bajarnos el tarball o la última versión del repositorio SVN, os recomiendo el tarball para evitar posibles problemas. Primero instalamos la librería ffmpeg, ya que OpenCV depende de ella. Para ello tenemos que llamar al configure de la siguiente forma:

./configure --enable-shared --enable-pthreads --enable-openmp

después compilamos e instalamos con:

make
sudo make install

Nota importante: Si os falla en el proceso de compilación, pobrad a limpiar la configuración con “make distclean” y después empezar desde el configure.

Ahora viene lo interesante de todo este asunto. Una vez que descomprimimos OpenCV nos metemos dentro del directorio y abrimos el fichero configure para editarlo. En dicho fichero tenemos que sustituir todas las coincidencias de “ffmpeg/” por “libavcodec/” o “libswscale/” según corresponda.

  • Si aparece ffmpeg/avcodec.h -> reemplazar por -> libavcodec/avcodec.h (26 sustituciones)
  • Si aparece ffmpeg/swscale.h -> reemplazar por -> libswscale/swscale.h (26  sustituciones)

Además hay uno de los ficheros de código que también vamos a tener que modificar:”otherlibs/highgui/cvcap_ffmpeg.cpp”:

  • En las líneas 56,57 y 59 tenemos que hacer las sustituciones que he comentado antes de ffmpeg por libavcodec, libavformat o libswscale.
    #include <libavformat/avformat.h>
    #include <libavcodec/avcodec.h>
    #if defined(HAVE_FFMPEG_SWSCALE)
    #include <libswscale/swscale.h>
  • En la línea 768 reemplazamos
    size = avpicture_get_size(pix_fmt, width, height);
    por
    size = avpicture_get_size((PixelFormat)pix_fmt, width, height);
  • En la línea 1171 reemplazamos PIX_FMT_RGBA32 por PIX_FMT_RGB32.

después realizamos nuestro querido proceso de:

./configure
make
sudo make install

Y ya tenemos instalado OpenCV con soporte para librería highgui con ffmpeg ;) . Algún día pondré algún que otro ejemplo de como se usa OpenCV.

GD Star Rating
loading...
Share
  1. Rafa
    Lunes, 27 de abril de 2009 a las 23:57 | #1
    GD Star Rating
    loading...

    Funciona perfecto. ¡Muchas gracias!. Una tontería:

    Cuando dices “En la línea 867 reemplazamos…”, en realidad es la 768, lo has puesto al revés xD.

  2. Martes, 28 de abril de 2009 a las 06:25 | #2
    GD Star Rating
    loading...

    Ups! Cierto jeje. Ahora mismo lo corrijo. Gracias por el apunte ;)

  3. Martes, 5 de mayo de 2009 a las 10:49 | #3
    GD Star Rating
    loading...

    Trabajo con OpenCV y en concreto con la versión 1.1pre en Linux. Tuve algún problemilla con la libreria ffmpeg, así que probaré a ver lo que has escrito y os cuento.

    Gracias!

  4. Elmo
    Jueves, 21 de mayo de 2009 a las 16:36 | #4
    GD Star Rating
    loading...

    Eres la ostia Luis !!!

  5. Jueves, 21 de mayo de 2009 a las 16:38 | #5
    GD Star Rating
    loading...

    Noooo aquí el maquinote eres tú!!! jajaja :P . El Sábado para la feriaaa !

  6. Miércoles, 10 de junio de 2009 a las 09:51 | #6
    GD Star Rating
    loading...

    Ya lo he comprobado funciona a la perfección.

    Sólo como apunte: He tenido que usar la version .tar.gz 5.0 de la web oficial. Con la version SVN no me funcionaba.

    ¡GRACIAS!

    PD: Ahora sólo falta hacer funcionar el raw1394 ;)

  7. Miércoles, 10 de junio de 2009 a las 09:54 | #7
    GD Star Rating
    loading...

    Curioso lo del SVN, yo he probado con la versión que viene en debian lenny (que es más antigua que la de Ubuntu) y no he tenido problemas.

    Suerte con el raw1394, yo también lo uso pero por suerte cuento con una API ya implementada para manejar las cámaras de mi laboratorio :P .

    Saludos.

  8. Miércoles, 10 de junio de 2009 a las 10:56 | #8
    GD Star Rating
    loading...

    En mi caso, seguimos teniendo problemas con las versiones > 8.04 de Ubuntu + OpenCV > 1.0 cuando se trata de acceder a las cámaras. :(

    ¿Qué API usáis? ¿Es libre?

    Gracias Piponazo ;)

  9. Miércoles, 10 de junio de 2009 a las 12:12 | #9
    GD Star Rating
    loading...

    Jeje lo siento tArkI pero es una librería que tiene implementada uno de mis directores de tesis, y solo tengo permiso para usarla pero no creo que para distribuirla :P . Échale un vistazo a esta librería, tiene implementadas bastantes cosillas relacionadas con el tema de la visión por computador y quizás incluya algo de raw1394. http://cvlab.epfl.ch/software/bazar/index.php

  10. Miércoles, 10 de junio de 2009 a las 13:58 | #10
    GD Star Rating
    loading...

    No te preocupes Piponazo que me imaginaba que no podrías compartirla ;) Gracias de todas formas y gracias también por el enlace, porque aunque estoy desarrollando algo propio, me puede dar ideas.

    Saludos ^_^

  11. Pacman
    Jueves, 10 de septiembre de 2009 a las 21:32 | #11
    GD Star Rating
    loading...

    Lo hice en slackware 13 y no me funcionó, todo lo de las mofificaciones fueron validas, es decir, si encontre cada una de las lineas (los números de lineas) asi como las dijiste. Pero cuando intente instalar el opencv despues del ffmpeg no se pudo … me marca error el make

  12. Jueves, 10 de septiembre de 2009 a las 22:01 | #12
    GD Star Rating
    loading...

    Hola Pacman, si quieres escribe un comentario con los mensajes de error que te aparecen e intento echarte una mano ;) . A mi también me ha fallado a veces según los parámetros de configuración que le ponía.

  13. Pacman
    Jueves, 10 de septiembre de 2009 a las 23:34 | #13
    GD Star Rating
    loading...

    hola piponazo:
    Descargue el ffmpeg-0.5 y el opencv-1.1.0.
    Lo primero que no me funcionó de la guia es el argumento “–enable-openmp”, asi que lo quite y ya, instalé el ffmpeg.
    De ahi hice las modificaciones en el configure del opencv y del archivo cvcap_ffmpeg.cpp .
    El problema es que cuando hago el make me muestra:
    make[3]: *** [cvcap_ffmpeg.lo] Error 1
    make[3]: Leaving directory `/usr/src/opencv-1.1.0/otherlibs/highgui’
    make[2]: *** [all-recursive] Error 1
    make[2]: Leaving directory `/usr/src/opencv-1.1.0/otherlibs’
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/usr/src/opencv-1.1.0′
    make: *** [all] Error 2

    y todavia no se como solucionarlo. Espero puedas ayudarme, gracias.

  14. Pacman
    Jueves, 10 de septiembre de 2009 a las 23:45 | #14
    GD Star Rating
    loading...

    @piponazo
    Hola piponazo, olvide mencionar que despues de instalar el ffmpeg-0.5 en slackware 13, intento utilizarlo para convertir un video a otro formato y no puedo usarlo. Al parecer no puede abrir un archivo:ffmpeg: error while loading shared libraries: libavdevice.so.52: cannot open shared object file: No such file or directory

    Llevo dos dias intentando instalarlo y aun no puedo, lo intente en el slackware 12.2 y tampoco. Hasta ahora solo me ha funcionado el Opencv en el slackware 11.0

    En el Slackware 11 si me funcionó, con el ffmpeg-0.4.9 y el opencv-0.9.7 . Ya intente hacerlo con esos y solamente he obtenido nada. De hecho he intentado desesperadamente todas las posibles combinaciones y tampoco (olvida el último comentario .. jajaja).

    Gracias.

  15. Viernes, 11 de septiembre de 2009 a las 06:27 | #15
    GD Star Rating
    loading...

    Pues parece que más que un fallo con opencv sea con ffmpeg como tu dices. Además el fichero que falla parece ser cvcap_ffmpeg.lo que es el capturador de vídeo mediante ffmpeg. Yo cuando usaba ubuntu también tuve bastantes problemas con todo este tinglado. Haz una cosa. Prueba a instalarte la última versión de desarrollo de ffmpeg:

    git clone git://git.ffmpeg.org/ffmpeg/
    cd ffmpeg
    git clone git://git.ffmpeg.org/libswscale/

    Después en el configure pon:

    ./configure –enable-shared –enable-pthreads

    Para habilitar la construcción de las librerías compartidas y el uso de phtread, Y ya instalas ffmpeg. Después procede a la instalación de OpenCV. Si te sigue fallando mándame un correo con la salida completa de la compilación vale ?. Mi correo es piponazo@plagatux.es.

    Saludos y suerte ;)

  16. Pacman
    Viernes, 11 de septiembre de 2009 a las 20:23 | #16
    GD Star Rating
    loading...

    @piponazo

    Paso lo mismo… talvez sea algo del slackware 13, al parecer es algo inestable. Me voy a regresar el 12. lo hara de nuevo y te digo que onda. Gracias.

  17. Pacman
    Sábado, 12 de septiembre de 2009 a las 03:04 | #17
    GD Star Rating
    loading...

    @piponazo

    Lo hice en el slackware 12.2 y si funciona el ffmpeg , pero el opencv no:

    cvcap_ffmpeg.cpp: In function ‘AVFrame* icv_alloc_picture_FFMPEG(int, int, int, bool)’:
    cvcap_ffmpeg.cpp:777: error: invalid conversion from ‘int’ to ‘PixelFormat’
    cvcap_ffmpeg.cpp:777: error: initializing argument 3 of ‘int avpicture_fill(AVPicture*, uint8_t*, PixelFormat, int, int)’
    cvcap_ffmpeg.cpp: In member function ‘virtual bool CvVideoWriter_FFMPEG::writeFrame(const IplImage*)’:
    cvcap_ffmpeg.cpp:994: error: invalid conversion from ‘int’ to ‘PixelFormat’
    cvcap_ffmpeg.cpp:994: error: initializing argument 3 of ‘int avpicture_fill(AVPicture*, uint8_t*, PixelFormat, int, int)’
    cvcap_ffmpeg.cpp:1024: error: invalid conversion from ‘int’ to ‘PixelFormat’
    cvcap_ffmpeg.cpp:1024: error: initializing argument 3 of ‘int avpicture_fill(AVPicture*, uint8_t*, PixelFormat, int, int)’
    cvcap_ffmpeg.cpp: In member function ‘virtual bool CvVideoWriter_FFMPEG::open(const char*, int, double, CvSize, bool)’:
    cvcap_ffmpeg.cpp:1135: warning: ‘av_alloc_format_context’ is deprecated (declared at /usr/local/include/libavformat/avformat.h:801)
    cvcap_ffmpeg.cpp:1135: warning: ‘av_alloc_format_context’ is deprecated (declared at /usr/local/include/libavformat/avformat.h:801)
    cvcap_ffmpeg.cpp:1154: warning: dereferencing type-punned pointer will break strict-aliasing rules
    make[3]: *** [cvcap_ffmpeg.lo] Error 1
    make[3]: Leaving directory `/usr/src/opencv-1.1.0/otherlibs/highgui’
    make[2]: *** [all-recursive] Error 1
    make[2]: Leaving directory `/usr/src/opencv-1.1.0/otherlibs’
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/usr/src/opencv-1.1.0′
    make: *** [all] Error 2

    creo que ya estoy cerca ..

  18. Sábado, 12 de septiembre de 2009 a las 07:51 | #18
    GD Star Rating
    loading...

    Pues ya solo te falta ir corrigiendo esos errores que te comentan. En las líneas 777, 994 y 1024 tienes que hacer hacer un casting en casting en el tercer parámetro de la función avpicture_fill. Tan solo tienes que poner (PixelFormat) delante de la variable para realizar el casting explícitamente.

  19. Pacman
    Sábado, 12 de septiembre de 2009 a las 20:33 | #19
    GD Star Rating
    loading...

    ya funciono, estaba haciendo unas tonterias pero al fin ya pude hacer que jale. Gracias

  20. festo21
    Viernes, 21 de mayo de 2010 a las 22:39 | #20
    GD Star Rating
    loading...

    Cordial saludo. Estoy intentando instalar el opencv-1.1pre junto con ffmpeg-0.5 en fedora 7. Realize la instalacion de ffmpeg realizando lo siguiente
    ./configure –enable-shared –enable-pthreads
    make
    sudo make install

    descomprimi opencv-1.1.0 y realize las modificaciones al configure y al otherlibs/hihgui/cvcap_ffmpeg.cpp tal como se indica en esta pagina.
    Luego procedi al ./configure, hasta ahi todo normal, luego al dar el make aparece lo siguiente:
    make[3]: *** [cvcap_ffmpeg.lo] Error 1
    make[3]: se sale del directorio `/usr/local/opencv-1.1.0/otherlibs/highgui’
    make[2]: *** [all-recursive] Error 1
    make[2]: se sale del directorio `/usr/local/opencv-1.1.0/otherlibs’
    make[1]: *** [all-recursive] Error 1
    make[1]: se sale del directorio `/usr/local/opencv-1.1.0′
    make: *** [all] Error 2
    Por favor si pudieran ayudarme les agradeceria muchisimo.
    De ante mano gracias por la atencion
    Suerte

  21. Sábado, 22 de mayo de 2010 a las 11:49 | #21
    GD Star Rating
    loading...

    Hola Festo. Si puedes pásame por correo (piponazo@plagatux.es) la salida completa de cuando haces el make. También te diría que pruebes directamente a probar con la versión nueva de OpenCV (la versión 2.1) que es totalmente compatible con las versiones anteriores. Saludos.

  1. Domingo, 12 de julio de 2009 a las 17:09 | #1