OpenCv e Ffmpeg

11 12 2008

Premesse

Con OpenCv è possibile, oltre che acquisire il video da una webcam, anche farlo a partire da un filmat, ad esempio un AVi. Tuttavia è necessario compilare OpenCv con il supporto per Ffmepg la nota e stra-usata librerie per l’elaborazione di media. Vediamo come riuscire a compilare e far funzionare il tutto

Ffmpeg

Per prima cosa installiamo i pacchetti gtk2 e SDL devel

ad es. da fedora

yum install gtk2-devel SDL-devel

mentre da ubuntu

apt-get install libgtk2.0-dev libsdl1.2-dev

Ora possiamo scaricare ed installare ffmpeg da svn

svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --enable-shared --enable-swscale --enable-gpl
make
make install
echo "/usr/local/lib" >/etc/ld.so.conf.d/ffmpeg.conf
ldconfig

Per testare il funzionamento provare
ffplay passandogli un qualunque file video (mpg, flv, avi, …).

OpenCv

Scarichiamo l’ultima versione da qui

Prima di passare alla compilazione bisogna aggiungere al classico path degli includes la cartella di ffmpeg

cd /usr/local/include/
mkdir ffmpeg
cd ffmpeg
find ../ -name "*.h" | xargs -n1 ln -s

Opa possiamo scompattare opencv e lanciare l’installazione:

tar -zxvf opencv-1.1pre1.tar.gz
./configure --enable-gpl --enable-apps --enable-shared --with-ffmpeg --with-gnu-ld --with-x --without-quicktime CXXFLAGS=-fno-strict-aliasing CFLAGS=-I/usr/local/include/ffmpeg CPPFLAGS=-I/usr/local/include/ffmpeg LDFLAGS=-L/usr/local/lib

Dopo il configure bisogna notare che sia posto a yes il supporto a ffmpeg

...
Use gtk+ 2.x: yes
Use gthread: yes
...
Use ffmpeg: yes
...

se tutto è a posto possiamo dare il classico make e …andare a prendere un bel caffè

make
make install

Alcuni errori di compilazione…

Durante la compilazione potrebbero presentarsi degli errori (anche se con le ultime versioni di ffmpeg dovrebbero essere stati corretti…)

Qualcosa del tipo integer constant is too large for ‘long’ type

Per ovviare al problema bisogna aggiungere in testa al file “otherlibs/highgui/cvcap_ffmpeg.cpp” le seguenti righe:

#define INT64_C
#define __STDC_CONSTANT_MACROS

Inoltre nelle versioni più recenti di ffmpeg si potrebbe presentare un problema su un puntatore, in questo caso sempre in “otherlibs/highgui/cvcap_ffmpeg.cpp” bisogna sostituire:

url_fclose(&mywriter->oc->pb);
con
url_fclose(mywriter->oc->pb);

Inoltre mi è capitato con ultime versioni di ffmpeg ed OpenCv 1.1pre di trovare alla compilazione di opencv i seguenti errori

error: invalid conversion from ‘int’ to ‘PixelFormat’

per risolverlo bisogna fare uin casting forzato dal tipo int in PixelFormat nel file cvcap_ffmpeg.cpp. Nello specifico sostituire:

tutte le occorrenze di pix_fmt con (PixelFormat)pix_fmt

Ancora sostiutire

int input_pix_fmt;

con

PixelFormat input_pix_fmt;

e modificare l’inizializzazione da

input_pix_fmt = 0;

con

input_pix_fmt = PIX_FMT_NONE;

ricompilando comparirà poi l’errore

error: ‘PIX_FMT_RGBA32’ was not declared in this scope

questo si risolve aprendo il solito file

vi otherlibs/highgui/cvcap_ffmpeg.cpp

e modificando

PIX_FMT_RGBA32

con

PIX_FMT_RGB32

Ultima cosa: è importante controllare le versioni di OpenCv ed Ffmpeg, in particolare io ho testato il tutto con una Fedora Core 8, OpenCv 1.1pre e Ffmpeg SVN-r16043 o superiore. Utilizzando una versione più vecchia di OpenCv (1.0) si presenta in compilazione un errore su “img_conver” che e’ una funzione obsoleta e non più presente nelle ultime versioni di Ffmpeg.

Annunci