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.
