Opencv 1.1pre + ffmpeg en Linux
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.
loading...


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.
loading...
Ups! Cierto jeje. Ahora mismo lo corrijo. Gracias por el apunte
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!
loading...
Eres la ostia Luis !!!
loading...
Noooo aquí el maquinote eres tú!!! jajaja
. El Sábado para la feriaaa !
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
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
.
Saludos.
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
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
. É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
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 ^_^
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
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.
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.
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.
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
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.
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 ..
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.
loading...
ya funciono, estaba haciendo unas tonterias pero al fin ya pude hacer que jale. Gracias
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
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.